我在今天的面试中问到了这个问题。
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) {
}
}所以我需要写transfer()方法,所以它将是线程安全的,帐户余额应该是>= 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时,它会产生死锁。所以第二个问题是,如何修复死锁?
发布于 2013-08-28 20:13:31
您必须以相同的顺序锁定对象,否则将出现死锁。
顺便说一句:鉴于锁的开销比所执行的操作要高得多,您最好使用全局锁或只使用一个线程。
https://stackoverflow.com/questions/18487464
复制相似问题