快速理解线程锁

快速理解线程锁线程锁线程锁真的好麻烦啊!!!找了几篇博客发现写的都不一样相关联内容太多不容易理解所以现在需要理清什么是线程锁应用场景怎么用优缺点1.什么是线程锁机制多线程可以同时运行多个任务但是当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误!so,不使用线程锁,可能导致错误啰嗦两句:比如你在银行取钱的同时你女朋友用支付宝取钱…

大家好,又见面了,我是你们的朋友全栈君。

线程锁

线程锁真的好麻烦啊!!!

找了几篇博客发现写的都不一样 相关联内容太多不容易理解

所以现在需要理清

  • 什么是线程锁
  • 应用场景
  • 怎么用
  • 优缺点

1. 什么是线程锁机制

多线程可以同时运行多个任务

但是当多个线程同时访问共享数据时,可能导致数据不同步,甚至错误!

so,不使用线程锁, 可能导致错误

啰嗦两句: 比如你在银行取钱的同时你女朋友用支付宝取钱 不同线程同时访问同一资源 如果资源不加锁可能会导致银行亏本 卡里有100却取出200这种错误

2. 应用场景

I/O密集型操作 需要资源保持同步

3.用法

#锁的使用
#创建锁
lock = threading.Lock()
#锁定
lock.acquire([timeout])
#释放
lock.release()

example

import  threading   
import  time   

counter = 0 
counter_lock = threading.Lock() #只是定义一个锁,并不是给资源加锁,你可以定义多个锁,像下两行代码,当你需要占用这个资源时,任何一个锁都可以锁这个资源 
counter_lock2 = threading.Lock()  
counter_lock3 = threading.Lock() 

#可以使用上边三个锁的任何一个来锁定资源 

class MyThread(threading.Thread):#使用类定义thread,继承threading.Thread 
     def __init__(self,name):   
        threading.Thread.__init__(self)   
        self.name = "Thread-" + str(name) 
     def run(self):   #run函数必须实现 
         global counter,counter_lock #多线程是共享资源的,使用全局变量 
         time.sleep(1);   
         if counter_lock.acquire(): #当需要独占counter资源时,必须先锁定,这个锁可以是任意的一个锁,可以使用上边定义的3个锁中的任意一个 
            counter += 1    
            print "I am %s, set counter:%s"  % (self.name,counter)   
            counter_lock.release() #使用完counter资源必须要将这个锁打开,让其他线程使用 

if  __name__ ==  "__main__":   
    for i in xrange(1,101):   
        my_thread = MyThread(i) 
        my_thread.start()

4.优缺点

优点:保证资源同步
缺点:有等待肯定会慢

5.扩展(死锁与递归锁)

如果多个线程要调用多个对象,而A线程调用A锁占用了A对象,B线程调用了B锁占用了B对象,A线程不能调用B对象,B线程不能调用A对象,于是一直等待。这就造成了线程“死锁”。

Threading模块中,也有一个类,RLock,称之为可重入锁。该锁对象内部维护着一个Lock和一个counter对象。counter对象记录了acquire的次数,使得资源可以被多次require。最后,当所有RLock被release后,其他线程才能获取资源。在同一个线程中,RLock.acquire可以被多次调用,利用该特性,可以解决部分死锁问题。

就是把 lock=threading.Lock()改成lock = threading.RLock()

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/152035.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Telnet 1521端口连接失败问题,经过四天的努力终于解决!

    Telnet 1521端口连接失败问题,经过四天的努力终于解决!1由于安装oracle之后,安装plsql都是自动检测orcl实例的ip及其端口,最近突然发现plsql连不上,于是尝试telnet1521端口,于是发现端口连接失败的问题。经过几经摸索,解决了该问题。2注意:安装的oracle11g,12c版本时,listener.ora监听文件,没有自动添加红色圈里面的sid_name的设置,这点需要注意检查配置。  3环境变量配置,也很重要,这是…

    2022年5月23日
    53
  • PermitRootLogin是基于UID还是用户名?

    PermitRootLogin是基于UID还是用户名?Sometimesitisfuntodigabitdeeperintohowthingsworkjusttosatisfyyourcuriositywhilelearningsomethingnew,likePermitRootLogin,forexample.DoesitchecktheUIDortheusername?Tod…

    2022年5月20日
    51
  • ibatis isnotequal_英语中is和are的用法

    ibatis isnotequal_英语中is和are的用法一:isEquals用于动态拼接sql如下实例:如果status的状态为0,则更新attribute1;状态为1,则更新attribute2;状态为2,则更新attribute3。<updateid="topup.doEffect"parameterClass="java.util.HashMap">updatecis_customersetcode_id=…

    2022年9月28日
    3
  • Lua使用心得(2)

    在lua脚本调用中,如果我们碰到一种不好的脚本,例如:while1dodoend那我们的程序主线程也会被阻塞住。那我们如何防止这种问题呢?下面就给出一个解决的办法。首先为了不阻塞主线程,

    2021年12月25日
    56
  • emwin用户设置界面_强制刷新快捷键

    emwin用户设置界面_强制刷新快捷键1、在对话框回调函数中定时重绘按键_cbDialogHome(WM_MESSAGE*pMsg){ Switch(pMsg->MsgId){ CaseWM_INIT_DIALOG: WM_CreateTimer(pMsg->hWin,0,100,0);//创建窗口定时器 CaseWM_PAINT://窗口重绘 CaseWM_NOTIFY_

    2022年10月15日
    4
  • RealVNC Server Ubuntu 20.04 无显示器连接 虚拟显示器

    RealVNC Server Ubuntu 20.04 无显示器连接 虚拟显示器以前尝试过完全不接显示器,vnc连接设置总是不成功,这次很容易做成功了,记录一下。以前记录的远程桌面使用心得:https://blog.csdn.net/u012911347/article/details/80475254RealVNC远程连接带显示器模式:https://blog.csdn.net/u012911347/article/details/81209222RealVNC远程连接无显示器模式,但是要用非原生桌面:https://blog.csdn.net/u012911

    2022年8月21日
    34

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号