什么是死锁:
死锁指的是由于两个或者两个以上的线程在执行的过程中,由于竞争资源或者由于彼此通信而造成的阻塞现象,若无外力处理,他们将无法继续进行下去。
死锁发生的必要条件:
- 互斥条件:在线程中资源的使用具有排他性。
- 请求和保护条件:自己的资源不愿意放出去,别人的资源拿不进来。
- 不剥夺条件:自己的资源,不适用前也不能被别的线程使用,知道自己使用完成后自动释放出去别的线程才能使用。
- 环路等待条件:环形等待,(想想三角恋关系就能理解了!)
死锁产生的原因:
从上面的四个必要条件,我们可以总结出产生的原因有:
- 一个线程占有别的线程所需要的资源;
- 都不想放弃自己拥有的资源。
如何避免死锁:破坏四个必要条件就ok了!
死锁代码演示:
"""
死锁情形模拟
"""
from threading import Thread,Lock
from time import sleep
# 账户类
class Account:
def __init__(self,_id,balance,lock):
self.id = _id # id
self.balance = balance # 存款
self.lock = lock # 维护锁
# 取钱
def withdraw(self,amount):
self.balance -= amount
# 存钱
def deposit(self,amount):
self.balance += amount
# 查看余额
def get_balance(self):
return self.balance
# 生成两个账户
Tom = Account('Tom',12000,Lock())
Abby = Account('Abby',9000,Lock())
# 转账 账户金额变动需要先上锁
def transfer(from_,to,amount):
if from_.lock.acquire():
from_.withdraw(amount) # from_账户钱减少
sleep(0.1)
if to.lock.acquire():
to.deposit(amount) # to 存钱
to.lock.release()
from_.lock.release()
print("%s给%s转了%d元"%(from_.id,to.id,amount))
t1 = Thread(target=transfer,args=(Tom,Abby,4000))
t2 = Thread(target=transfer,args=(Abby,Tom,1500))
t1.start()
t2.start()
t1.join()
t2.join()
print("Tom:",Tom.get_balance())
print("Abby:",Abby.get_balance())