1. #在threading模块当中定义了一个Lock类,可以方便的使用锁定:
  2.  
  3. # #1.创建锁
  4. # mutex = threading.Lock()
  5. #
  6. # #2.锁定
  7. '''
  8. mutex.acquire(True/False)
  9. True:如果所要获取的资源已经"锁定",表示当前线程处地等待(阻塞),直到获取到这个锁为止--默认值
  10. False:不阻塞,即不管本次调用能够成功上锁,都不会卡在这,而是继续执行后面的代码
  11.  
  12. '''
  13. # #3.解锁
  14. # mutex.release()
  15. import threading,time
  16. #全局变量
  17. g_num = 0
  18. def w1():
  19. global g_num
  20. for i in range(10000000):
  21. #上锁
  22. mutexFlag = mutex.acquire(True)
  23. if mutexFlag:
  24. g_num+=1
  25. #解锁
  26. mutex.release()
  27. print("test1---g_num=%d"%g_num)
  28.  
  29. def w2():
  30. global g_num
  31. for i in range(10000000):
  32. # 上锁
  33. mutexFlag = mutex.acquire(True)
  34. if mutexFlag:
  35. g_num+=1
  36. # 解锁
  37. mutex.release()
  38. print("test2---g_num=%d" % g_num)
  39.  
  40. if __name__ == "__main__":
  41. #创建锁
  42. mutex = threading.Lock()
  43.  
  44. t1 = threading.Thread(target=w1)
  45. t1.start()
  46.  
  47. t2 = threading.Thread(target=w2)
  48. t2.start()
  49.  
  50. #互斥锁
  51. '''
  52. 当多个线程几乎同时修改某一个共享数据的时候,需要进行同步控制.
  53. 线程同步能够保证多个线程安全访问,"竞争资源",最简单的同步机制就是引用互斥锁
  54. 互斥锁为资源引入一个状态:锁定/非锁定状态
  55. 某个线程要更改共享数据时,先将其锁定,此时资源的状态是锁定状态,其他线程不能更改
  56. 直到当前线程释放资源.将资源变成"非锁定"状态,其他的线程才能再次锁定该资源
  57.  
  58. 互斥锁保证了每次只有一个线程进行"写操作",从而保证多个线程的正确性
  59.  
  60. 上锁/解锁过程
  61. 当一个线程调用锁的acquire()方法获取琐时,锁就进行锁定"Locked"状态
  62. 每次只有一个线程可以获得这个锁,如果此时拎一个线程试图获取锁中的资源,该线程就会变成"阻塞"状态
  63. 直到拥有锁的那个线程执行release(),锁就变成"非锁定(Unlocked)"状态
  64. 线程调试程序从处于同步阻塞状态的线程中选择一个来获得锁,并使得该线程进入"运行(running)状态"
  65.  
  66. 总结:
  67. 锁的好处:
  68. 1.确定了某一段代码只能由一个线程来从头到尾完整的执行
  69. 2.全局变量的安全
  70.  
  71. 锁的坏处:
  72. 1.阻止了多线程的并发执行,包含锁的某段代码实际上只能以单线程模块执行,效率大大的下降了
  73. 2.由于可以存在多个锁,不同的线程持有不同的锁,并试图获取对方持有的锁时,可能会造成"死锁".
  74.  
  75. '''

12.定义Lock类,用于锁定数据.三步走,锁的优缺点的更多相关文章

  1. Knative 实战:三步走!基于 Knative Serverless 技术实现一个短网址服务

    短网址顾名思义就是使用比较短的网址代替很长的网址.维基百科上面的解释是这样的: 短网址又称网址缩短.缩短网址.URL 缩短等,指的是一种互联网上的技术与服务,此服务可以提供一个非常短小的 URL 以代 ...

  2. git 三步走

    git三步走: git add .        (注:别忘记后面的.,此操作是把Test文件夹下面的文件都添加进来) git commit  -m  "提交信息"  (注:“提交 ...

  3. Python学习笔记(一)三步走安装pip

    pip是用来方便地管理Python的第三方包的,由于此前玩Python仅仅是浅尝辄止,用的是python(x,y),但是这里并不代表你想用什么包都能从里面找到的,所以我把python(x,y)卸了,然 ...

  4. 三步走起 提升 iOS 审核通过率 上篇

    <ignore_js_op> Bugly 技术干货系列内容主要涉及移动开发方向,是由 Bugly 邀请腾讯内部各位技术大咖,通过日常工作经验的总结以及感悟撰写而成,内容均属原创,转载请标明 ...

  5. 用powershell+excel行列转置三步走

    本文重点讲解第一步,手动在excel表中输入公式,或者用powershell自动输入公式. 第二步,用powershell向excel中写入数据,略. 第三步,用powershell从excel中读取 ...

  6. 三步走起 提升 iOS 审核通过率 下篇

    根据2015年的数据统计情况,并结合<苹果应用商店审核指南>,互娱 iOS 预审组通过细分将预审工作划为3大模块:客户端资源检查.应用内容检查和提审资源检查. 在上一篇文章中,Bugly ...

  7. mongodb安装和配置三步走

    最近在重新学习node,所以和同事一起搞了个模仿新浪微博的项目,项目刚开始,所以其他的东西就暂时先不提.这里介绍下mongodb的安装.直接搜索可以看到很多介绍,但是我第一次是失败了,不过看了好几个还 ...

  8. 【php学习】图片处理三步走

    前两天要对一张图片进行处理,其实很简单,就是在图片上加上字符串,一个图片而已,但是自己如同得了短暂性失忆似的,图片操作的函数一个都想不起来.所以就抽空整理了一下图片操作函数. 1. 创建画布 从文件中 ...

  9. 6、DockerFile解析:三步走、保留字指令

    1.dockerfiel是什么 1.是什么 Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 2.构建三步骤 编写Dockerfile文件 docker bu ...

随机推荐

  1. python 导入json模块的用法

    json用于字符串,和 python数据类型间进行转换,json模块有四个功能,dumps,dump,loads,load. json 用法 json.dumps 将数据通过特殊的形式转换为所有程序语 ...

  2. Azkaban 2.5.0的详细安装过程

    准备下载Azkaban2.5.0:https://azkaban.github.io/downloads.htm 准备插件: 一.MySQL安装与配置 启动数据库并查看状态:sudo service ...

  3. Git分支操作步骤

    学习操作Git分支,具体如下: - 查看分支 - 创建分支 - 切换分支 - 合并分支 - 解决分支的冲突 方案: Git支持按功能模块,时间,版本等标准创建分支; 分支可以让开发分多条主线同时进行, ...

  4. Centos7 tomcat 启动权限

      Cannot find bin/catalina.sh The file is absent or does not have execute permission This file is ne ...

  5. P4206[NOI2005]聪聪与可可

    链接P4206 [NOI2005]聪聪与可可 类似于开车旅行,如果老鼠确定了那么猫的路线是确定的. 预处理\(g_{i,j}\)表示老鼠在\(i\)号点,猫的下一步方向,\(Bfs\)就行了 设\(f ...

  6. bzoj4448 [Scoi2015]情报传递 主席树+树上差分

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4448 题解 练习一下主席树的基础练习题找回感觉. 对于每一次询问,第一问显然随便做. 第二问的 ...

  7. TP5+阿里云OSS上传文件第三节,实现淘宝上传商品图片

    **TP5+阿里云OSS上传文件第三节,实现淘宝上传商品图片首先我们来看看淘宝的功能和样式:** 之后看看制作完成的演示:(由于全部功能弄成GIF有点大,限制上传大小好像在1M之内,压缩之后也有1.9 ...

  8. Rabbit给单独的消息设置超时

    /** * 发送消息 * @param user */@RequestMapping(value = prefix+"/setRabbitMessage", method = Re ...

  9. HDU 5386 Cover

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5386 题目大意:给一个初始矩阵(n×n).一个目标矩阵(n×n)和m个操作,要求找到一种操作顺序,使初 ...

  10. centos启动提示unexpected inconsistency RUN fsck MANUALLY

    今天一台虚拟机背后的物理机故障了,主机迁移后变成了 read only filesystem.上面部署了很多长连接服务,没有关掉就直接reboot,报错: unexpected inconsisten ...