将您的金额声明为
AtomicInteger不会阻止线程在方法执行过程中被抢占(如果未同步)。因此,举例来说,如果您的方法
transfer_funds没有以任何方式同步,即使您的方法数量达到
AtomicInteger
public boolean transfer_funds(Account acc, int amount){ // dest : acc if (enoughFund(amount)){ withdraw(amount); // <- thread can be preempted in the middle of method execution acc.deposit(amount); return true; } return false; }这些问题称为比赛条件。一个可能的示例是,当两个线程尝试从同一帐户转移资金时。当一个线程确定
enoughFund要进行信用转账时,该线程可能会被抢占,同时另一个线程可以开始从该帐户转账资金。当第一个线程再次开始处理时,它不会再次检查是否有
enoughFunds执行信用转帐的操作(他已经检查过了,但是他的知识可能已经过时了),但是转到下一个执行行。这样,您可能无法获得一致的结果。您可以更改所有帐户开始时的总金额。
Cay Horstmann的Core Java书中对此方面有很好的解释-
这是免费提供的有关同步的章节。它详细描述了您要问的几乎完全相同的问题。



