我有一个场景,我必须从帐户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中处理此方案? 提前感谢您的回复。
答案 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);
}
}
}