Java 银行转账同步
我在今天的采访中得到了这个问题Java 银行转账同步,java,concurrency,deadlock,Java,Concurrency,Deadlock,我在今天的采访中得到了这个问题 class BankAccount { private int money; public synchronized void deposite(int sum) { money += sum; } public synchronized void withdraw(int sum) { money -= sum; } public synchronized int getMon
class BankAccount {
private int money;
public synchronized void deposite(int sum) {
money += sum;
}
public synchronized void withdraw(int sum) {
money -= sum;
}
public synchronized int getMoney() {
return money;
}
}
class accountManager {
public void transfer(BankAccount a, BankAccount b, int money) {
}
}
所以我需要编写转账方法,这样它将是线程安全的,并且帐户余额应>=0
public void transfer(BankAccount a, BankAccount b, int money) {
synchronized ( a ) {
synchronized ( b ) {
int temp = a.getMoney() - money;
if (temp >= 0) {
a.withdraw(temp);
b.add(temp);
}
}
}
}
我写了这个,但当我们同时从a转移到b和从b转移到a时,会产生死锁。因此,第二个问题是,如何修复死锁?必须以相同的顺序锁定对象,否则会出现死锁
顺便说一句:如果锁比执行的操作要昂贵得多,那么最好使用全局锁或仅使用一个线程。必须以相同的顺序锁定对象,否则会出现死锁 顺便说一句:鉴于锁比执行的操作要昂贵得多,您最好使用全局锁或仅使用一个线程。可能的重复