Java多线程 - 银行应用程序

时间:2017-08-30 16:11:45

标签: java multithreading synchronization

我有一个场景,我必须从帐户A到B进行汇款。 为此,我使用了synchronized块,如:

public void transaction(Account A , Account B , Number Amount){
    Synchronized(this){
        A - amount;
        B + amount;
        commit;
    }
}

此方法适用于A到B之间的事务,但问题是:它也会阻止所有其他事务。 即,当交易A - > B正在进行,同时C - > D之间的交易也将被阻止。 理想地,A-> B之间的交易不应影响交易C-> D。

如何在Java中处理此方案? 提前感谢您的回复。

1 个答案:

答案 0 :(得分:1)

正如我昨天在评论中所说,您可以使用“帐户”作为监视器来解决问题。 要防止死锁,您始终必须以相同的顺序锁定对象:

public void transcation(Account a, Account b, long amount) {
    long id1 = a.getID();// The ID must be final and unique!
    long id2 = b.getID();
    Object monitor1 = id1 < id2 ? a : b;
    Object monitor2 = id1 > id2 ? a : b;

    synchronized (monitor1) {
        synchronized (monitor2) {
            a.setCredit(a.getCredit() + amount);
            b.setCredit(b.getCredit() - amount);
        }
    }
}