2017-08-30 2 views
-2

ich ein Szenario, wo in ich muss Weisung von Konto A nach B Zu diesem Zweck ich etwas synchronisierten Block dergleichen durchführen: istJava Multithreading - Banking Anwendung

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

für Transaktion feinen Dieser Ansatz zwischen A bis B, aber das Problem ist: Es blockiert auch alle anderen Transaktionen. , d. H. Während die Transaktion A -> B läuft, wird gleichzeitig die Transaktion zwischen C -> D ebenfalls blockiert. Idealerweise sollte die Transaktion zwischen A-> B die Transaktion C-> D nicht beeinflussen.

Wie kann dieses Szenario in Java behandelt werden? Vielen Dank im Voraus für die Antwort.

+0

Warum würden Sie so schlecht formatiert PLZ? Bitte machen Sie es nicht schwerer, Ihren Code zu verstehen. Bearbeitet und behoben. –

+0

https://docs.oracle.com/javase/tutorial/essential/concurrency/index.html - hier sollten Sie beginnen. –

+2

@HovercraftFullOfEels verwenden nicht einfach Account als Monitor, der einen Deadlock verursachen kann. Wenn A Geld an B transferiert und B Geld an A gleichzeitig transferiert: Thread 1 sperrt A, Thread 2 sperrt B, Thread 1 versucht B zu sperren, aber Thread 2 sperrt bereits, Thread 2 versucht A, aber Thread 1 zu sperren bereits gesperrt -> Deadlock. Sie können es tun, wenn Sie immer das Konto mit der niedrigeren ID zuerst sperren –

Antwort

0

Wie ich gestern in meinem Kommentar sagte, können Sie Ihr Problem mit den Konten als Ihr Monitor lösen. einen Deadlock zu vermeiden, müssen Sie immer die Objekte in der gleichen Reihenfolge sperren:

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

..really Danke für die Erklärung, ich habe den Punkt. –