import threading
class Account:
def __init__(self, balance):
self.balance = balance
self.condition = threading.Condition()
def transfer(self, amount, target_account):
with self.condition:
while self.balance < amount:
self.condition.wait()
self.balance -= amount
target_account.deposit(amount)
def deposit(self, amount):
with self.condition:
self.balance += amount
self.condition.notify_all()
设计思路:
- 定义账户类
Account
:
- 包含账户余额
balance
作为共享资源。
- 创建
threading.Condition
对象 condition
,用于线程间的协作和同步。
transfer
方法:
- 使用
with self.condition
上下文管理器获取锁。
- 检查当前账户余额是否足够,如果不足则调用
self.condition.wait()
使当前线程等待,释放锁并暂停执行,直到被其他线程唤醒。
- 当余额足够时,扣除相应金额,并调用目标账户的
deposit
方法。
deposit
方法:
- 使用
with self.condition
上下文管理器获取锁。
- 增加账户余额,并调用
self.condition.notify_all()
唤醒所有等待在 condition
上的线程,通知它们账户余额已经改变,可能满足了等待条件。这样,通过 threading.Condition
实现了多线程环境下对账户余额操作的安全控制,避免了资源竞争问题,确保资金的安全转移。