锁——死锁——单个锁锁死
锁:
from threading import Thread,Lock # 创建一个互斥锁 mutex = Lock()def task1():# 锁定 mutex.acquire()for i in range(100):print("===================")# 打开 mutex.release() def task2():mutex.acquire()for i in range(100):print("!!!!!!!!!!!!!!!!!!")mutex.release()def task3():mutex.acquire()for i in range(100):print("********************")mutex.release()t1 = Thread(target=task1) t2 = Thread(target=task2) t3 = Thread(target=task3)t1.start() t2.start() t3.start()
代码演示
死锁:
from threading import Thread,Lock import time,randommutex1 = Lock() #创建一个锁1 mutex2 = Lock() #创建一个锁2 def fun1():mutex1.acquire()print("抢到了锁1")time.sleep(1)mutex2.acquire()print("抢到了锁2")mutex2.release()print("释放了锁2")mutex1.release()print("释放了锁1")def fun2():mutex2.acquire()print("抢到了锁2")time.sleep(1)mutex1.acquire()print("抢到了锁1")mutex1.release()print("释放了锁2")mutex2.release()print("释放了锁1")# def fun3(): # fun1() # fun2( t1 = Thread(target=fun1) t1.start() t2 = Thread(target=fun2) t2.start()
代码演示1
from threading import Thread,Lock,current_thread,RLock import time # 叉子 locka = RLock() # 盘子 lockb = RLock()def task1():print(current_thread())locka.acquire()print("抢到叉子 需要盘子")time.sleep(0.1)lockb.acquire()print("吃饭")lockb.release()locka.release()def task2():print(current_thread())lockb.acquire()print("抢到盘子 需要叉子")time.sleep(0.1)locka.acquire()print("吃饭")locka.release()lockb.release()t1 = Thread(target=task1) t1.start() t2 = Thread(target=task2) t2.start()# 死锁发生的条件 有多个线程 多个锁 如果只有一个锁 无论是LOCK RLOK 卡不死(前提是逻辑上没有错误) # RLock 就算你的代码逻辑不对 同一个线程多次对一个锁执行acquire 也不会卡死
代码演示2
单个锁:(递归锁/重入锁)
单个锁能不能锁死____答案是肯定的:
from threading import Thread,Lock,RLock,current_threadl = Lock() # 互斥锁# l.acquire() # print("zxxzxxxzxzx") # l.acquire() # print("aaaaaaaaa")# RLock 递归锁 重入锁 可以多次执行acquire# lock = RLock() # # lock.acquire() # print("aaaaaaaaaaa") # lock.acquire() # print("bbbbbbbbbbb")import time lock = RLock() # 对于同一个线程而言 可以多次acquire 其他线程会被阻塞 def task():lock.acquire()for i in range(5):time.sleep(1)print(current_thread())lock.release()Thread(target=task).start() Thread(target=task).start()
代码演示
信号量:(也是一种锁)
from threading import Thread,Semaphore,current_thread,active_countimport time # 用于控制 同时执行被锁定代码的线程数量 也就是线程的并发数量 # 也是一种锁 sm = Semaphore(1)def task():sm.acquire()for i in range(10):print(current_thread())time.sleep(0.5)sm.release()def task2():for i in range(10):print(current_thread())time.sleep(0.5)for i in range(5):Thread(target=task).start()Thread(target=task2).start() print(active_count())
代码演示
转载于:https://www.cnblogs.com/TF511/p/9936884.html
锁——死锁——单个锁锁死相关推荐
- 036-2018-1028 线程 效率对比 数据共享 同步锁死锁递归锁 守护线程 信号量
笔记 昨日内容回顾: 队列:Queue 管道 : Pipe ,recv消息的时候 OSError,EOFError,数据不安全的 Manager : 共享数据 , 数据不安全 , 加锁 进程池 : P ...
- 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁...
线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i ...
- MySQL 锁的相关知识 | lock与latch、锁的类型、简谈MVCC、锁算法、死锁、锁升级
文章目录 lock与latch 锁的类型 MVCC 一致性非锁定读(快照读) 一致性锁定读(当前读) 锁算法 死锁 锁升级 lock与latch 在了解数据库锁之前,首先就要区分开 lock 和 la ...
- Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)
文章目录 一.并发与并行 二.同步与异步 三.线程锁 1.GIL全局解释器锁 2.同步锁 3.死锁 4.递归锁 在Python中GIL解释器锁.同步锁.死锁.递归锁都是什么?怎么这么多锁,它们都是用来 ...
- MySQL数据库的锁(什么是数据库的锁?什么是乐观锁和悲观锁?什么是死锁?如何避免?)
数据库的锁 什么是数据库的锁? 数据库的锁与隔离级别的关系? 数据库锁的类型有哪些? MySQL中InnoDB引擎的行锁模式及其是如何实现的? 什么是数据库的乐观锁和悲观锁,如何实现? 什么是死锁?如 ...
- 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)
线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...
- MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解
MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...
- [精选]MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)
不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的.因为数据库隐式帮我们 ...
- C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁
C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 参考文章: (1)C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 (2) 通信缓冲区 资源上,并且已被选作死锁牺牲品.请 ...
最新文章
- 【java】兴唐第二十四节课
- ios:ScrollView联动效果
- 科大星云诗社动态20211205
- 信息摘要算法之四:SHA512算法分析与实现
- php 数据导出到excel文件,PHP导出数据到excel文件
- TorchSeg—基于PyTorch的快速模块化语义分割开源库
- android真机调试
- PuttyPsftp
- maya python 游戏与影视编程指南pdf_《Maya Python游戏与影视编程指南》.( [美]Adam Mechtley).[PDF]...
- 鉴定网站是否允许IPV6访问方法(湖大IPV6下载流量免费)
- 解决eclipse 错误: 找不到或无法加载主类
- 如何使用ps的扭曲里面的旋转扭曲
- 电脑桌面无图标,任务栏也不见了
- 欧拉定理的应用:Counting regions
- SEE Conf 大会直播邀请函丨体验技术风向标
- JAVA操作properties配置文件
- 马云正式卸任:一文回顾马云的区块链“阳谋”
- Reporting Service:纵向合并单元格
- 倍福--清除随机分配的内存地址
- aws搭建java项目_开发人员指南 - AWS SDK for Java 1.x - 适用于 Java 的 AWS 开发工具包...