Dieser Artikel zeigt hauptsächlich das Java-Programmier-Multi-Thread-Verarbeitungsszenario durch ein Beispiel dafür, dass Bankbenutzer wie folgt Geld abheben.
Beginnen Sie mit einem Beispiel: Implementieren Sie den Beispielcode für ein Bankkonto -Abhebungsszenario.
Die erste Klasse: Account.java
Kontokategorie:
Paket Cn.edu.Byr.Test; public Class Account {private String accountNo; privater Doppelbilanz; public Account () {} public account (String accountNo, Double Balance) {this.accountno = accountNo; this.balance = Balance;} public int int hashcode () {return accountno.hashcode ()} öffentlich ()} öffentlich ()} öffentlich -Sting -Sting -Get -Get -Get -Get -Get -Get -Getno () () {)} öffentlich (); GetBalance () {return this.balance;} public void setbalance (doppelte Balance) {this.balance = balance;} public boolean gleich (Object obj) {if (this == obj) return true; if (obj! FALSCH;}} Die zweite Klasse: Drawthread.java
Geldauszahlungsthreadklasse:
Paket Cn.edu.Byr.Test; öffentliche Klasse DrawThread erweitert Thread {private Account; private double drawamount; public drawthread (String -Name, Konto -Konto, doppeltes DrawAmount) {Super (name); this.account = account; this.drawamount = DrawaMount; DrawAmount) {System.out.println (getName () + "Geld erfolgreich bekommen, die Banknoten ausspucken:" + DrawAmount); // try {// Thread.sleep (1); //} // catch (interruptedException e) {// e.printstacktrace (); //} Account.SetBalance (Account.getBalance () - DrawAmount); System.out.println ("/t Der Restbetrag ist:" + account.getBalance ());} else system.out.println (getName () + "Geld abheben Geld fehlgeschlagen, der Restbetrag ist unzureichend!"); //}} public static void Main (String [] args) {account act = new Account ("123456", 1000; Drawthread ("A", Acct, 800) .Start (); New Drawthread ("B", Acct, 800) .start ();}} Der kommentierte Teil im obigen Code: (1) Synchronisierter Synchronisationscode Block (2) Thread -Winterschlaf. Wenn (1) und (2), gibt es viele Möglichkeiten für das Laufergebnis, eine der Möglichkeiten (die Wahrscheinlichkeit ist gering), die der normalen Logik entsprechen:
B zieht erfolgreich Geld ab, spuckt das Geld aus: 800,0
Bilanz ist: 200.0
Ein gescheiterter Rückzug und der Restbetrag war nicht ausreichend!
Es sollte sein, dass B zuerst die Geldauszahlungsressource findet und den Restbetrag korrekt modifiziert, bevor A beginnt, das Benutzerbetrag zu beurteilen. Diese Wahrscheinlichkeit ist sehr gering, und die meisten Operationen werden den folgenden Situationen ähnlich sein:
A erfolgreich Geld abhebt und das Geld ausspuckt: 800,0
B zieht erfolgreich Geld ab, spuckt das Geld aus: 800,0
Bilanz ist: -600.0
Bilanz ist: 200.0
Das ist offensichtlich unlogisch. Aus den laufenden Ergebnissen können wir vermuten, dass ein erstmals die Ressource einnimmt und den Betrag zurückzieht. Bevor sie das Gleichgewicht ändern, wird die Ressource jedoch von B beschlagnahmt. Da der Restbetrag nicht geändert wurde, sieht B, dass der Saldo noch 800 beträgt, und B zieht den Betrag immer noch zurück. Ein erstes ausgeführt die Änderungsauslastung, druckt sie jedoch nicht aus, B schnappt sich die Ressource. B modifiziert das Gleichgewicht und druckt die Balance, die -600 beträgt; A druckt die Balance, die 200 beträgt;
Wenn (2) Faden schläft, muss er eine Fehlerbedingung sein, da A oder B CPU -Ressourcen aufgrund des Schlafes nach dem Abholen der Menge freigeben und der JVM andere Prozesse im Bereitschaftszustand aufruft. Die zweite Sache ist, Geld abzuheben und den Restbetrag zu beurteilen, muss falsch sein.
Wenn (1) synchronisierter synchronisierter Codeblock hinzugefügt wird, ist das Konto im Thread -Laufmethode -Körper gesperrt. Dann ist die Ausführungslogik jedes Mal garantiert normal:
A erfolgreich Geld abhebt und das Geld ausspuckt: 800,0
Bilanz ist: 200.0
B versäumte es, Geld abzuheben, und der Restbetrag war nicht ausreichend!
Sie können sich den Ausführungsprozess vorstellen:
Eine erste gibt die Ressource vor und sperrt die Kontoklasse zunächst im Run -Methode -Körper. Dann beginnt der Synchroncode -Block auszuführen. Wenn es in einen bestimmten Link in der Mitte ausgeführt wird, wird die CPU -Ressource durch B vorgegeben. B beginnt mit der Ausführung und sperrt die Kontoklasse am Anfang. Wenn Sie jedoch ein Schloss hinzufügen, werden Sie jedoch feststellen, dass das Konto von A besetzt ist und es an einen Blockierungszustand angepasst wird und darauf wartet, dass A die Ressource veröffentlicht. Nachdem A den Synchron -Code -Block ausgeführt hat, wird die Kontosperrung veröffentlicht, und B wird weiterhin ausgeführt. Das Gleichgewicht beim Ausführen von B wird garantiert durch a geändert und wird normalerweise gemäß der richtigen Logik ausgeführt.
Zusammenfassen
Der oben genannte ist der Inhalt dieses Artikels über die Analyse der gleichzeitigen Verarbeitung von Multi-Thread-Verarbeitung von Java-Programmierungen, und ich hoffe, dass es für alle hilfreich sein wird. Interessierte Freunde können weiterhin auf andere verwandte Themen auf dieser Website verweisen. Wenn es Mängel gibt, hinterlassen Sie bitte eine Nachricht, um darauf hinzuweisen. Vielen Dank an Freunde für Ihre Unterstützung für diese Seite!