模拟多线程中死锁产生的练习

本文通过两个账户间的转账操作,模拟并演示了死锁现象。使用Python的threading模块和Lock对象,创建了两个线程分别代表账户Tom和Alex进行相互转账。然而,由于资源竞争和锁定顺序的不同,导致了死锁情况的发生。
"""
模拟死锁的产生过程
"""
from time import sleep
from threading import Thread,Lock

# 账户类
class Account:
    def __init__(self,_id,balance,lock):
        self.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',5000,Lock())
Alex = Account('Alex',8000,Lock())

def transfer(from_,to,amount):
    """
    :param from_: 从该账户转钱
    :param to:  给这个账户转入
    :param amount: 转账金额
    :return: None
    """
    from_.lock.acquire()  # from_上锁
    from_.withdraw(amount) # from_减少
    sleep(0.1)
    from_.lock.release()  # from_解锁
    to.lock.acquire() # to上锁
    to.deposit(amount) # to钱增加
    to.lock.release() # to解锁
    # from_.lock.release() # from_解锁


t1=Thread(target=transfer,args=(Tom,Alex,1500))
t2=Thread(target=transfer,args=(Alex,Tom,3000))
t1.start()
t2.start()
t1.join()
t2.join()

print("Tom:",Tom.get_balance())
print("Alex:",Alex.get_balance())

注:Tom和Alex通过两个线程互相转账,但是它们调的是同一个共有资源,当两个线程运行的时候,就会发生互相卡住,谁也无法调用资源的情况,也就是死锁。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值