快速理解线程锁

快速理解线程锁线程锁线程锁真的好麻烦啊!!!找了几篇博客发现写的都不一样相关联内容太多不容易理解所以现在需要理清什么是线程锁应用场景怎么用优缺点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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • _beginthread, _beginthreadex

    _beginthread, _beginthreadex语法uintptr_t_beginthread(//NATIVECODEvoid(__cdecl*start_address)(void*),unsignedstack_size,void*arglist);uintptr_t_beginthread(//MANAGEDCODEvoid(__clrcall*start_add…

    2025年6月15日
    3
  • net MVC 3.0 1

    net MVC 3.0 1首先,我们为什么要用MVC呢,因为比起

    2022年7月27日
    6
  • 键盘失灵重启电脑就没事了_笔记本电脑重启后黑屏

    键盘失灵重启电脑就没事了_笔记本电脑重启后黑屏问题描述:下午,卸载了360软件(安全卫士、软件管家、360安全浏览器)后,重启电脑,然后电脑开始硬盘扫描、检测,结果告知不能成功修复。随后,我选择“继续使用Win10“选项,就发现电脑键盘已经失灵,无法输入开机密码,一度让我抓狂。在随后的的近3个小时的过程中,经历了以下调试过程:1.硬重启电脑(即,按住开机键不动,直到重启),发现没用2.重启后按F8、F10键试图进入安…

    2022年8月12日
    6
  • 详述Java中sort排序函数

    详述Java中sort排序函数手写一个排序算法的效率是很慢的,当然这也不利于我们在比赛或者工程中的实战,如今几乎每个语言的标准库中都有排序算法,今天让我来给大家讲解一下Java语言中的sort排序Collections类中的sort方法可以实现List接口的集合进行排序降序排序Java中降序排序有俩种方法(和c++很类似,可以看我这篇博客):c++sort排序实现Comparator接口的复写compare()方法排序原理通常,在看有关算法书籍的时候,会发现都说有关数组的排序算法,而且使用的都是随机访问,但是

    2022年7月12日
    17
  • 适配器的作用[通俗易懂]

    适配器的作用[通俗易懂]首先我们从一般的概念上讨论一下计算机是怎样连接到局域网上的。计算机与外界局域网的连接是通过通信适配器(adapter)。适配器本来是在主机箱内插入的一块网络接口板(或者是在笔记本电脑中插入一块PCMCIA卡)。这种接口板又称为网络接口NIC(NetworkInterfaceCard)或简称为“网卡”。由于较新的计算机主板上已经嵌入了这种适配器,不使用单独的网卡了,因此…

    2022年6月12日
    35
  • AutoEventWireup属性

    AutoEventWireup属性aspx页面第一行page指令中包含了一个AutoEventWireup属性2008-09-1417:15使用Asp.NET时,新建的aspx页面第一行page指令中包含了一个AutoEventWireup属性。网上的很多教程认为这一属性,甚至这一行代码都是没用的。其实,这是不了解Asp.NET事件处理模型的表现。简单来说,这一属性决定了当前页是否自动关联某些特殊事件。…

    2022年5月8日
    39

发表回复

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

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