快速理解线程锁

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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • leetcode 颜色分类_leetcode难度

    leetcode 颜色分类_leetcode难度给定一个包含红色、白色和蓝色,一共 n 个元素的数组,原地对它们进行排序,使得相同颜色的元素相邻,并按照红色、白色、蓝色顺序排列。此题中,我们使用整数 0、 1 和 2 分别表示红色、白色和蓝色。示例 1:输入:nums = [2,0,2,1,1,0]输出:[0,0,1,1,2,2]示例 2:输入:nums = [2,0,1]输出:[0,1,2]示例 3:输入:nums = [0]输出:[0]示例 4:输入:nums = [1]输出:[1] 提示:n == num

  • c++酒店管理系统课程设计_酒店管理系统毕业设计

    c++酒店管理系统课程设计_酒店管理系统毕业设计课程设计-C#酒店管理系统1.主要功能:客户的入住管理、预定管理、客房管理、用户管理、收银结算、补交押金等等。数据库用的是Access。2.效果截图:登录页面主页面主要功能3.项目文件截图:想要源码加我QQ1352677818…

  • vim安装YouCompleteMe 插件

    vim安装YouCompleteMe 插件vim安装youcomplete插件,折磨我好久,装不好硬是要把它装好,结果最后终于装好这个补全的插件。为了需要安装的人少走弯路,我的安装过程如下(主要提供步骤):1、先看你的vim版本是多少。我的是vim7.4.52貌似支持python。但是还是不行说是不支持YCM。 最后只能安装vim8.0,手动安装。 具体可以vim–version看来下python和python3是否

  • centos7.4安装docker_centos docker安装部署

    centos7.4安装docker_centos docker安装部署前言当我们在一台电脑上搭建了python3.6的环境,下次换台电脑,又得重新搭建一次,设置环境变量等操作。好不容易安装好,一会提示pip不是内部或外部命令,一会又提示pip:commandno

  • hql语言

    hql语言hql语言

  • 30套JSP网站源代码合集

    30套JSP网站源代码合集JSP技术是以Java语言作为脚本语言的,JSP网页为整个服务器端的Java库单元提供了一个接口来服务于HTTP的应用程序。我收集了一些JSP开发的网站源代码,从实践中学习,希望对大家有用。资料名称下

发表回复

您的电子邮箱地址不会被公开。

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