我想开发一个lockmanager,它可以锁定许多变量并避免死锁。例如,以下代码:
长金额=…

//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对象:

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);
    }
  }
}

但您必须确保synchronize上的所有更新都在同一个地方进行,即使用同一个BankAccounts对象,即BankProcessing。这有缓慢的缺点,例如对lock的调用将阻止对bankLock的调用等,但这种缓慢可能值得处理银行转账。

09-12 16:49