编写在多线程Java环境中更新两个对象的方法的最佳方法?

Dan*_*nig 6 java parallel-processing multithreading java-5

假设我们有一个名为AccountService的类来管理帐户状态.

AccountService定义为

interface AccountService{
 public void debit(account);
 public void credit(account);
 public void transfer(Account account, Account account1);

}
Run Code Online (Sandbox Code Playgroud)

鉴于此定义,实现transfer()的最佳方法是什么,以便您可以保证传输是原子操作.

我对引用Java 1.4代码的答案以及可能使用Java 5中的java.util.concurrent资源的答案感兴趣

Edw*_*ale 11

同步两个Account对象并进行传输.确保始终以相同的顺序同步.为此,请创建Account实现Comparable,对两个帐户进行排序,然后按该顺序进行同步.

如果您没有订购帐户,如果一个线程从A转移到B而另一个从B转移到A,则会出现死锁的可能性.

这个确切的例子在Java Concurrency in Practice的第207页讨论,这是任何进行多线程Java开发的人的重要书籍.示例代码可从发布者的网站获得:

  • 另外,如果处理Java 5和更新版本,最好实现`Comparable <Account>`而不是`Comparable`. (3认同)
  • 这种同步都不能保证如果事务的一半失败,另一半将失败.这只是处理同步问题. (2认同)