2017-08-30 8 views
-2

私はその目的のためにB. に口座Aからの送金を実行する必要がで私のような同期ブロックの何か使用シナリオがあります。このアプローチは、トランザクションの罰金です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は単にアカウントをモニターとして使用するだけではなく、デッドロックを引き起こす可能性があります。 AがBに資金を転送し、Bが同時にAに金銭を振り替えると、スレッド1はAを、スレッド2はBをロックし、スレッド1はBをロックしようとするが、スレッド2はすでにロックしており、スレッド2はAをロックしようとしているすでにロックしています - >デッドロックです。常に低い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

..本当に説明のおかげで、私はポイントを得た。 –

関連する問題