2017-08-30 51 views
-2

我遇到的情况,在我要执行从账户A转账到B 为此我用synchronized块一样的东西:的Java多线程 - 银行申请

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

你为什么要张贴这样的格式化不好的代码?请不要让它更难理解你的代码。编辑并修复。 –

+0

https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html - 这是你应该开始的地方。 –

+2

@HovercraftFullOfEels不会简单地使用Account作为监视器,这可能导致死锁。当A将资金转移到B并且B将资金同时转移给A时:线程1锁定A,线程2锁定B,线程1尝试锁定B但线程2已锁定线程2,线程2尝试锁定A但线程1已经锁定它 - >死锁。你可以这样做,如果你总是锁定帐户与低ID第一 –

回答

0

正如我在昨天的评论中所说的,您可以使用帐户作为您的显示器来解决您的问题。 为了防止死锁,你总是要锁定对象以相同的顺序:

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); 
     } 
    } 
} 
+0

..真是谢谢你的解释,我明白了。 –