java - 银行转账同步

标签 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 时,它会产生死锁。那么第二个问题是,如何解决死锁?

最佳答案

你必须以相同的顺序锁定对象,否则你会陷入死锁。

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

关于java - 银行转账同步,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18487464/

相关文章:

java - Java 桌面应用程序的 HSQLDB 有哪些限制?

java - tomcat7 的当前服务器状态信息

java - 无法打开 Alfresco admin-consle.jsp

从 SWT 3 切换到 SWT 4 时,JAVA SWT KeyDown 事件触发了 3 次而不是 1 次

java - 调用锁中的调用顺序,分两种情况

java - 列表上的 ConcurrentModificationException

concurrency - 聊天机器人 : ensuring serial processing of messages on a per-conversation basis in clustered environment

sql-server - 触发器导致死锁?

java - 无法解决与Java Threads相关的教科书示例

java - 如何从文本文件创建对象数组?