Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java LockManager-idea和API_Java_Algorithm_Design Patterns_Concurrency_Locking - Fatal编程技术网

Java LockManager-idea和API

Java LockManager-idea和API,java,algorithm,design-patterns,concurrency,locking,Java,Algorithm,Design Patterns,Concurrency,Locking,我想开发一个锁管理器,它可以锁定许多变量并避免死锁。例如,以下代码: 长金额= //two bank accounts final BankAccount ba1 = ... final BankAccount ba2 = ... synchronized(ba1, ba2){ ba1.transfer(amount , ba2); } 可替换为: <!-- language: java --> //two bank accounts final BankAccount b

我想开发一个锁管理器,它可以锁定许多变量并避免死锁。例如,以下代码:

长金额=

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

                            } );

//两个银行账户
最终银行账户ba1=。。。
最终银行账户ba2=。。。
//同步银行帐户
最终锁管理器锁管理器=…
同步器。同步(ba1,锁定模式。写入,
ba2,锁定模式,写入,
新交易(){
@凌驾
public void execute(){
...
ba1.转让(金额,ba2);
}
} );
我需要你对这个想法和提议的API的意见

感谢您的反馈,并致以最诚挚的问候


Andrej

在对所需对象执行所有操作期间,您可以使用单个
锁定对象,
同步对象周围的

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

但您必须确保
银行账户
上的所有更新都发生在一个地方,即
银行处理
使用相同的
锁定
对象,即
锁定
。这有缓慢的缺点,例如调用
decrete
将阻止调用
转账
等。但这种缓慢可能值得处理银行转账

您认为您提出的解决方案的优势是什么?使用多线程是为了提高性能。在考虑这样一个解决方案时,您需要确保使用多线程比使用简单得多的单线程解决方案更快。我希望通过使用LockManager,多线程编程变得更简单,开发成本更低(优势)。此类程序的性能与真正的细粒度锁定软件不同,但要比单线程程序快得多。LockManager应该调度许多锁,并支持细粒度锁定之类的功能。我希望这将提供比全局锁更好的性能。向安德烈问好