#使用类的封装来定义线程
import threading
import time
#代表🐟的锁
mutex_Yu=threading.Lock()
#代表熊掌的锁
mutex_XiongZhang=threading.Lock()
#创建一个类 类里边自定义一个方法 重写run函数
class MyThread1(threading.Thread):
def run(self):
mutex_Yu.acquire() #得到🐟这把锁
print("线程1已经得到鱼了")
time.sleep(1)
mutex_XiongZhang.acquire() #得到熊掌这把锁
print("线程1得到熊掌了")
mutex_XiongZhang.release() #释放熊掌
mutex_Yu.release()#释放鱼
class MyThread2(threading.Thread):
def run(self):
mutex_XiongZhang.acquire() # 得到熊掌这把锁
print("线程2得到熊掌了")
time.sleep(1)
mutex_Yu.acquire() # 得到🐟这把锁
print("线程2已经得到鱼了")
mutex_Yu.release() # 释放鱼
mutex_XiongZhang.release() # 释放熊掌
#mutex_TianTang=threading.Lock() # 一把去天堂的锁 Lock为互斥锁:只有一个人可以拿到 具有唯一性 可以使用逻辑锁来避免这种情况
mutex_TianTang=threading.RLock() #使用逻辑锁
class MyThread3(threading.Thread):
def run(self):
mutex_TianTang.acquire() #获得去天堂的锁钥匙
print("线程3进入了天堂")
time.sleep(1)
self.run() #再次调用天堂的锁
mutex_TianTang.release() #释放去天堂的锁
if __name__ == '__main__': #入口
#t1=MyThread1()
#t2=MyThread2()
t3=MyThread3()
#t1.start()
#t2.start()
t3.start()
死锁的原因:
在多线程程序中,死锁问题很大一部分是由于线程同时获取多个锁造成的。
在线程间共享多个资源的时候,如果两个线程分别占有一部分资源并且同时等待对方的资源,就会造成死锁。
进入死锁状态,命令行可以可以使用ctrl-z退出
产生死锁的四个必要条件:
(1) 互斥条件:一个资源每次只能被一个线程使用。
(2) 请求与保持条件:一个线程因请求资源而阻塞时,对 已获得的资源保持不放。
(3) 不剥夺条件:线程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等 待条件:若干线程之间形成一种头尾相接的循环等待资源关系。
