快速理解线程锁

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


相关推荐

  • 使用AnalyticDB MySQL创建数据库及表过程

    使用AnalyticDB MySQL创建数据库及表过程简介目标是让云上数据仓库用户及开发者通过简单的步骤体验基于AnalyticDBMySQL版和DMS构建云原生数据仓库的主要流程,场景将通过实例的开通、结构与数据的初始化、报表的开发、报表可视化等环节,用3个具体的应用场景来体验AnalyticDBMySQL版在新零售场景下的交互查询和ETL计算速度,以及通过DMS进行数据仓库数据报表开发的流程。提供的数据集是一个零售场景的模拟数据,包括客户信息、订单记录、货物信息、国家地域信息等内容,数据总量10GB,最大数据表记录数为5999万条。产品简介云原

    2022年9月17日
    5
  • c语言int16_msgbox用法举例

    c语言int16_msgbox用法举例在看别人代码的时候看到了__int16定义的变量于是好奇,为什么不用int定义上网查了一下首先要知道这里的16是指16个位一个汉子有两个字节(byte)一个int有4个字节而一个字节有8个位(bit)也就是一个int有32个位(bit)而这里的__int16也就是一个汉字的长度但int是两个汉字的长度这样定义还有一个优点就是无论什么操作系统所定义出来的

    2022年8月15日
    8
  • vlan的基础配置_图文并茂的图片制作二年级

    vlan的基础配置_图文并茂的图片制作二年级VLAN的简单配置实例(图文并茂)一.实验环境首先我们得有简单的实验环境:GNS3,C2691路由器二.实验图示如图,先建立如图所示的简单拓扑图。注:记得给交换机设置好参数。如图三.实验步骤首先我们得配置好三台主机的ip地址。配置如图。pc1pc2pc3主机配置完成。接下来我们开始设置交换机。如图我们可以查看路由功能查看我们已经设置好的vlan和接口。先配好三个vlan…

    2022年9月19日
    3
  • idea 2022.01激活(JetBrains全家桶)2022.01.28

    (idea 2022.01激活)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~GTRP…

    2022年3月31日
    55
  • CentOS 7 安装 LNMP 环境(PHP7 + MySQL5.7 + Nginx1.10)

    CentOS 7 安装 LNMP 环境(PHP7 + MySQL5.7 + Nginx1.10)

    2021年10月18日
    50
  • sqlserver创建视图索引「建议收藏」

    sqlserver创建视图索引「建议收藏」索引视图创建注意事项对视图创建的第一个索引必须是唯一聚集索引。创建唯一聚集索引后,可以创建更多非聚集索引。为视图创建唯一聚集索引可以提高查询性能,因为视图在数据库中的存储方式与具有聚集索引的表的存储方式相同。查询优化器可使用索引视图加快执行查询的速度。要使优化器考虑将该视图作为替换,并不需要在查询中引用该视图。索引视图中列的large_value_types_out_of_row选项的设置继承的是基表中相应列的设置。此值是使用sp_tableoption设置的。从表达式组成的列的默认设

    2022年7月22日
    9

发表回复

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

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