我正在实施一个并行银行系统,其中所有操作都可以同时运行。我已经实现了一个线程安全的方法,从帐户传输到。transferMoneyamountfromto
transferMoney使用以下代码实现:
public boolean transferMoney(Account from, Account to, int amount) {
if (from.getId() == to.getId()){
return false;
}else if(from.getId() < to.getId()) {
synchronized(to) {
synchronized(from) {
if(from.getBalance() >= amount) {
from.setBalance(from.getBalance()-amount);
to.setBalance(to.getBalance()+amount);
}else {
return false;
}
}
}
}else {
synchronized(from) {
synchronized(to) {
if(from.getBalance() >= amount) {
from.setBalance(from.getBalance()-amount);
to.setBalance(to.getBalance()+amount);
}else {
return false;
}
}
}
}
return true;
}
为了防止死锁,我指定始终以相同的顺序获取锁。为了确保以相同的顺序获取锁,我使用的唯一 .IDAccount
此外,我还实现了一个方法,该方法使用以下代码汇总了银行中的总金额:
public int sumAccounts(List<Account> accounts) {
AtomicInteger sum = new AtomicInteger();
synchronized(Account.class) {
for (Account a : accounts) {
sum.getAndAdd(a.getBalance());
}
}
return sum.intValue();
}
问题
当我同时运行时,即使没有添加任何钱,我最终也会在银行里得到更多(有时更少)的钱。根据我的理解,如果我通过 锁定所有对象,难道我不应该得到正确的银行总和,因为我正在阻止执行?sumAccounts()transferMoney()Accountsynchronized(Account.class)transferMoney()
慕姐8265434
收到一只叮咚
MMMHUHU
jeck猫
随时随地看视频慕课网APP
相关分类