Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/315.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 银行转账同步_Java_Concurrency_Deadlock - Fatal编程技术网

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时,会产生死锁。因此,第二个问题是,如何修复死锁?

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


顺便说一句:如果锁比执行的操作要昂贵得多,那么最好使用全局锁或仅使用一个线程。

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

顺便说一句:鉴于锁比执行的操作要昂贵得多,您最好使用全局锁或仅使用一个线程。

可能的重复