# -*- coding: utf-8 -*-
"""
学习 多线程同步 使用锁 threading.Lock()
逻辑:
2 个线程,操作同一个整型变量,一个加法,另外一个减法 总结:
1. 锁不是加在共享数据上,不像数据库锁加在数据上 ,好像是锁定修改数据的程序代码,任何时候,锁定的代码
最多被一个线程执行
2. 某段操作共享数据的代码加锁了,如果共享数据在代码其他地方有修改逻辑,没加锁
数据逻辑性无法保证
3. 锁获得,释放之间的代码可以不操作共享数据 ,仅仅实现线程之间的控制协调关系
4. 代码中可以使用多个锁,但是可能 造成死锁,相互等待对方的锁 有几个并发程序, 要不要操作共享数据,在代码哪里加锁,哪里释放锁。都要考虑进去
后 ,才能保证程序逻辑正确
操作共享数据, 应该 在所有修改数据的地方,加上同一把锁
读取数据的地方,根据逻辑,判断是否加上锁 使用:
1. 创建锁 lock = threading.Lock()
2. 在某段代码开始 获取锁 lock.acquire()
3. 在某段代码结束 释放锁 lock.release() 相关:
threading.RLock() """ import threading
import time lock = threading.Lock() # 锁
data = 0 # 共享数据 class Thread1(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item
def run(self):
print("begin",threading.currentThread().getName(),time.strftime('%M:%S',time.localtime(time.time())))
global data
lock.acquire() # 获取锁
time.sleep(2)
data += 1
print(threading.currentThread().getName(),data)
time.sleep(2)
data += 1
lock.release() # 释放锁
print(threading.currentThread().getName(),data)
print "\n","end",threading.currentThread().getName(),time.strftime('%M:%S',time.localtime(time.time())) class Thread2(threading.Thread):
def __init__(self,item):
threading.Thread.__init__(self)
self.item = item
def run(self):
print("begin",threading.currentThread().getName(),time.strftime('%M:%S',time.localtime(time.time())))
time.sleep(1)
global data
lock.acquire() # 获取锁
time.sleep(2)
data -= 2
print(threading.currentThread().getName(),data)
time.sleep(2)
data -= 2
lock.release() # 释放锁
print(threading.currentThread().getName(),data)
print "\n","end",threading.currentThread().getName(),time.strftime('%M:%S',time.localtime(time.time())) t1 = Thread1(0)
t2 = Thread2(0) t1.start()
t2.start() t1.join()
t2.join() print "end" """
Out: ('begin', 'Thread-1', '35:47')
('begin', 'Thread-2', '35:47')
('Thread-1', 1)
('Thread-1', 2) end Thread-1 35:51
('Thread-2', 0)
('Thread-2', -2) end Thread-2 35:55
end
""" """
Thread2的锁操作注释掉
Out: ('begin', 'Thread-1', '36:29')
('begin', 'Thread-2', '36:29')
('Thread-1', 1)
('Thread-2', -1)
('Thread-1', 0) end Thread-1 36:33
('Thread-2', -2) end Thread-2 36:34
end
"""

Out1 保证 在操作共享数据的地方,执行完线程1,再执行线程2

Out2 即使在线程1中加了锁,但是线程2没有加锁,两个代码在同时跑。 数据一致性无法保证

最新文章

  1. MySQL 磁盘I/O问题
  2. python3.5-day5_迭代器_生成器_装饰器_模块
  3. python django 多级业务树形结构规划及页面渲染
  4. [转]OnKeyDown Numeric Validator CLIENT SIDE
  5. Visual paradigm Db Archtecture Database config
  6. elasticsearch2.2 集群搭建各种坑
  7. webstorm配置react
  8. 使用 Make 命令构建网站
  9. 【转】 i2c驱动调试经验
  10. AngularJs(八) 过滤器filter创建
  11. 没有开发者账号,如何解锁wp8设备
  12. JS 冷知识,运行机制
  13. java单链表反转(花了半个多小时的作品)
  14. Linux 设置系统时间和时区1.Centos
  15. [原创] debian 9.3 搭建Jira+Confluence+Bitbucket项目管理工具(一) -- 安装jdk(含jre)及 MySql 5.6.39
  16. C语言学习及应用笔记之一:C运算符优先级及使用问题
  17. PyCharm里面执行代码没问题,Jenkins执行时找不到第三方库
  18. ImportError: No module named _tkinter on macos
  19. javaweb学习之建立简单网站
  20. P3455 [POI2007]ZAP-Queries(莫比乌斯反演)

热门文章

  1. Java生鲜电商平台-商城系统库存问题分析以及产品设计对逻辑/物理删除思考
  2. Oracle数据库之第四篇
  3. PHP strstr 字符串函数
  4. SQLi-LABS Page-1(Basic Challenges) Less11-Less22
  5. Thymeleaf常用语法:表达式语法之运算符
  6. Spring Boot 2 使用自定义配置
  7. NCCL(Nvidia Collective multi-GPU Communication Library) Nvidia英伟达的Multi-GPU多卡通信框架NCCL 学习;PCIe 速率调研;
  8. 0day2安全——笔记2
  9. Leetcode450. 删除二叉搜索树中的节点
  10. DRF--认证和权限