银行转帐同步

时间:2013-08-28 12:08:11

标签: 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 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时它会产生死锁。所以第二个问题是,如何修复死锁?

1 个答案:

答案 0 :(得分:4)

您必须以相同的顺序锁定对象,否则会出现死锁。

BTW:鉴于锁定比执行的操作贵得多,最好使用全局锁定或只使用一个线程。