我有一个问题,我无法解决这个问题
void Transfer(Account a, Account b, decimal amount)
{
lock (a) {
lock (b) {
if (a.Balance < amount)
throw new InsufficientFundsExc();
a.Balance -= amount;
b.Balance += amount;
}
}
}
Run Code Online (Sandbox Code Playgroud)
问题是"这是银行账户之间的转移."锁定(...)"结构用于对抗竞争条件.这个问题是什么?你提出什么解决方案?你可以帮我吗?
Cod*_*aos 10
如果你在从B转移到A的同时从A转移到B,它可能会死锁,因为你没有锁定命令.
但是为什么这个代码首先是多线程的呢?
您需要始终以相同的顺序获取锁.例如,通过为每个锁提供一个整数Id并始终首先锁定较低的ID.
| 归档时间: |
|
| 查看次数: |
1372 次 |
| 最近记录: |