LockManager - 理念和 API

问题描述 投票:0回答:1

我想开发一个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 的意见。

java algorithm design-patterns concurrency locking
1个回答
0
投票

在对所需对象进行所有操作期间,您可以使用单个

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
等。但这种缓慢可能值得处理银行转账。

© www.soinside.com 2019 - 2024. All rights reserved.