2017-02-04 3 views
-3

Ich habe Zweifel an Java MultiThreading. Angenommen, ich habe eine Banking-Anwendung. Sagen wir, ich habe einen Controller wie unten.Java MultiThreading Banking-Anwendung

public class BankAccount{ 

private String bankaccount; 

private long balance; 

getBalance(String bankaccount){ 

//code to get balance based on bankaccount number 

this.balance=value; //value is the balance i get from database 

} 

updateAccount(long value){ 

balance=balance-value; 

//code to store balance in database 
} 

Lassen Sie uns sagen, dass ich in einer Feder Anwendung über Code verwendet haben ich ein Szenario, wo für eine bestimmte Kontonummer der Rest ist 10000.A Mann und Frau sind beide Betrag aus dem gleichen Konto abzuheben versucht, sich von 2 verschiedene Geldautomaten. Da Server intern Multi-Threading verwenden, ist für das obige Szenario eine Synchronisierung erforderlich. Ich habe folgende Zweifel

1) werden die obigen 2 Anforderungen erstellen zwei verschiedene Objekte der BankAccount-Klasse oder nur ein Objekt.

2) Wenn nur ein Objekt erstellt wird, kann der Server eine andere Kontonummer identifizieren und ein anderes Objekt erstellen, da die Aktualisierung einer Kontonummer nicht die Aktualisierung einer anderen Kontonummer blockieren sollte.

+2

Wort der Weisheit: nicht laufen, bevor Sie gehen können. –

+0

Ich bin sehr neu in MultiThreading. Jeder wird seine eigene Zeitleiste haben, um Dinge zu lernen. Jede Art von Hilfe wird hier geschätzt anstatt zu kritisieren. –

+0

Niemand wird Ihnen hier Vorträge geben. Es gibt viele Materialien im Netz über das Thema, also erst deine Hausaufgaben und dann komm wieder mit genauen Problemen. –

Antwort

0
  1. Es macht Sinn, um eine Lösung zu implementieren, wo nur eine einzige BankAccount Instanz für jede Kontonummer erstellt wird.

  2. Sie können das Schlüsselwort synchronized verwenden, um den Zugriff auf jede Instanz einzeln zu synchronisieren. Zum Beispiel:

    BankAccount account = new BankAccount("1234567890"); 
    synchronized (account) { 
        //perform a transaction here 
        account.updateAccount(100); 
    } 
    

    Auf diese Weise kann nur ein einzelner Thread den synchronisierten Block eingeben, während andere Threads blockiert, bis der erste Thread den Block existiert.