我想开发一个LockManager,它可以锁定很多变量并避免死锁。例如下面这段代码:
long amount = …
//two bank accounts
final BankAccount ba1 = ...
final BankAccount ba2 = ...
synchronized(ba1, ba2){
ba1.transfer(amount , ba2);
}
可以替换为:
<!-- language: java -->
//two bank accounts
final BankAccount ba1 = ...
final BankAccount ba2 = ...
//synchronize bank accounts
final LockManager<Object> lockManager = …
synchronizer.synchronize( ba1, LockMode.Write,
ba2, LockMode.Write,
new Transaction<Object>(){
@Override
public void execute() {
...
ba1.transfer(amount , ba2);
}
} );
我需要您对这个想法和提议的 API 的意见。
在对所需对象进行所有操作期间,您可以使用单个
lock
对象,在其周围使用 synchronize
:
class BankProcessing {
Object bankLock = new Object();
void transferAtoB(BankAccount a, BankAccount b) {
synchronize(bankLock) {
a.transfer(amount, b);
}
}
void deduct(BankAccount a, int amount) {
synchronize(bankLock) {
a.deduct(amount);
}
}
}
但是您必须确保
BankAccounts
上的所有更新都发生在一个地方,即 BankProcessing
使用相同的 lock
对象,即 bankLock
。这有缓慢的缺点,例如调用 deduct
将阻止调用 transfer
等。但这种缓慢可能值得处理银行转账。