锁:

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

锁——死锁——单个锁锁死相关推荐

  1. 036-2018-1028 线程 效率对比 数据共享 同步锁死锁递归锁 守护线程 信号量

    笔记 昨日内容回顾: 队列:Queue 管道 : Pipe ,recv消息的时候 OSError,EOFError,数据不安全的 Manager : 共享数据 , 数据不安全 , 加锁 进程池 : P ...

  2. 线程的创建 验证线程之间共享数据 守护线程 线程进程效率对比 锁 死锁 递归锁...

    线程(from threading import Thread):CPU调度的最小单位 线程的两种创建方式:方式一: 1 from threading import Thread 2 def f1(i ...

  3. MySQL 锁的相关知识 | lock与latch、锁的类型、简谈MVCC、锁算法、死锁、锁升级

    文章目录 lock与latch 锁的类型 MVCC 一致性非锁定读(快照读) 一致性锁定读(当前读) 锁算法 死锁 锁升级 lock与latch 在了解数据库锁之前,首先就要区分开 lock 和 la ...

  4. Python之进程+线程+协程(并发与并行、GIL锁、同步锁、死锁、递归锁)

    文章目录 一.并发与并行 二.同步与异步 三.线程锁 1.GIL全局解释器锁 2.同步锁 3.死锁 4.递归锁 在Python中GIL解释器锁.同步锁.死锁.递归锁都是什么?怎么这么多锁,它们都是用来 ...

  5. MySQL数据库的锁(什么是数据库的锁?什么是乐观锁和悲观锁?什么是死锁?如何避免?)

    数据库的锁 什么是数据库的锁? 数据库的锁与隔离级别的关系? 数据库锁的类型有哪些? MySQL中InnoDB引擎的行锁模式及其是如何实现的? 什么是数据库的乐观锁和悲观锁,如何实现? 什么是死锁?如 ...

  6. 6※、线程同步、同步锁、同步代码块的使用、同步锁释放的时机、ReentrantLock可重入锁、公平锁与非公平锁的区别、什么是死锁、线程间的通信(生产者和消费者模式)

    线程锁 1.※线程的同步:(要确保对象锁是一致的) 1.未使用同步锁的抢票 2.使用了同步锁的抢票 3.线程-同步代码块的使用 4.同步方法和代码块的区别 5.同步锁释放的时机 练习:多线程生产手机 ...

  7. MySQL/InnoDB中,乐观锁、悲观锁、共享锁、排它锁、行锁、表锁、死锁概念的理解

    MySQL/InnoDB的加锁,一直是一个面试中常问的话题.例如,数据库如果有高并发请求,如何保证数据完整性?产生死锁问题如何排查并解决?我在工作过程中,也会经常用到,乐观锁,排它锁,等.于是今天就对 ...

  8. [精选]MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)

    不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的.因为数据库隐式帮我们 ...

  9. C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁

    C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 参考文章: (1)C#种死锁:事务(进程 ID 112)与另一个进程被死锁在 锁 (2) 通信缓冲区 资源上,并且已被选作死锁牺牲品.请 ...

最新文章

  1. 【java】兴唐第二十四节课
  2. ios:ScrollView联动效果
  3. 科大星云诗社动态20211205
  4. 信息摘要算法之四:SHA512算法分析与实现
  5. php 数据导出到excel文件,PHP导出数据到excel文件
  6. TorchSeg—基于PyTorch的快速模块化语义分割开源库
  7. android真机调试
  8. PuttyPsftp
  9. maya python 游戏与影视编程指南pdf_《Maya Python游戏与影视编程指南》.( [美]Adam Mechtley).[PDF]...
  10. 鉴定网站是否允许IPV6访问方法(湖大IPV6下载流量免费)
  11. 解决eclipse 错误: 找不到或无法加载主类
  12. 如何使用ps的扭曲里面的旋转扭曲
  13. 电脑桌面无图标,任务栏也不见了
  14. 欧拉定理的应用:Counting regions
  15. SEE Conf 大会直播邀请函丨体验技术风向标
  16. JAVA操作properties配置文件
  17. 马云正式卸任:一文回顾马云的区块链“阳谋”
  18. Reporting Service:纵向合并单元格
  19. 倍福--清除随机分配的内存地址
  20. aws搭建java项目_开发人员指南 - AWS SDK for Java 1.x - 适用于 Java 的 AWS 开发工具包...

热门文章

  1. c# winform 点击按钮切换tabcontrol标签
  2. poj 3693 后缀数组
  3. Qt程序等待/睡眠的正确方法
  4. Per-FedAvg:联邦个性化元学习
  5. 一文尽览 CVPR 2022 workshop 所有算法竞赛
  6. ICCV2021 人脸深伪分析挑战赛 重磅来袭
  7. CVPR2021—SurFree:一个快速的无代替模型的黑盒攻击
  8. 20种小技巧,玩转Google Colab
  9. CVPR 2020 | 3D目标检测泛化问题研究
  10. 首个实时单目3D目标检测算法:RTM3D,代码将开源