Ein kurzes Verständnis des Unterschieds zwischen Prozessen und Fäden im Betriebssystem:
Prozess: Jeder Prozess verfügt über einen unabhängigen Code- und Datenraum (Prozesskontext), und das Umschalten zwischen den Prozessen hat einen großen Overhead. Ein Prozess enthält 1-N-Threads. (Prozess ist die kleinste Einheit der Ressourcenzuweisung)
Thread: Der gleiche Typ von Threads teilen Code und Datenraum. Jeder Thread verfügt über einen unabhängigen Running -Stack und einen Programmzähler (PC), und der Überkopfschalter der Fadenschaltung ist gering. (Thread ist die kleinste Einheit der CPU -Planung)
Wie bei einem Prozess sind die Themen in fünf Phasen unterteilt: Erstellung, Bereit, Laufen, Blockieren und Beenden.
Multi-Process bedeutet, dass das Betriebssystem gleichzeitig mehrere Aufgaben (Programme) ausführen kann.
Multithreading bezieht sich auf mehrere sequentielle Streams, die im selben Programm ausgeführt werden. Zunächst sollte der Betrieb des Geldes und das Abheben des Geldes überlegt werden, und es kann viele Kunden geben. Dies bedeutet, dass es mehrere Threads geben muss und mehrere Threads gemeinsam eine Bank betreiben, und der Betrag der Bank muss synchronisiert werden. Nur durch Gewährleistung der Gewinne.
Lassen Sie uns dieses Beispiel dieses Code hier angeben. Wenn etwas nicht stimmt, weisen Sie bitte darauf hin. Weil ein alter Mann nach diesem Multi-Thread-Code gefragt hat.
Zunächst die Bank, die Erstellung dieses Objektmodells.
Paket com.lxk.threadtest.bank;/*** Bankmodell, ein Gesamtbetragattribut. * <p> * * @Author LXK am 2017/6/26 */Public Class Bank {/** * Geben Sie der Bank ein Startkapital, ansonsten wie können Sie Geschäfte machen? */private int sum = 200; // Dies wird nie so verwendet, aber es ist auch ein korrekter Verriegelungsmechanismus: Codeblockungen synchronisieren. // Objekt obj = new Object (); /*** Geld sparen* Wenn Sie [synchronisiert-synchronisiert] nicht hinzufügen, treten Sicherheitsprobleme mit mehreren Threaden auf. */public synchronisierte void add (int n) {// synchronisiert (obj) {sum = sum + n; try {thread.sleep (10);} catch (Ausnahme ignorieren) {} // Wenn die Anzahl der Zeiten des Sparens mehr wird, werden Sie feststellen, dass die Spar -Geld -Threads tatsächlich zwei altern Saving -Aktionen ausführen. System.out.println (Thread.currentThread (). GetName () + "... sum =" + sum); //}}/*** Geld abheben* Wenn Sie nicht [synchronisiert-Sync-Funktion] addieren, treten Multithread-Sicherheitsprobleme auf. */public synchronisierte void record (int n) {if (sum - n> = 0) {sum = sum - n;} else {system.out.println ("Bank der Bank ist nicht genug!");} versuchen Sie {Thread. Geld sparen. System.out.println (Thread.currentThread (). GetName () + "... sum =" + sum);}}Der Code enthält zwei Methoden: Speichern und Abholen, diese beiden Methoden und einen Gesamtbetrag sowie einige kommentierte Code. Das ist einfach und leicht zu verstehen, multi-threades sperren gegenseitig ausschließend und sorgt für die Synchronisation zwischen Threads.
Dies ist jedoch eine seltene Methode. Die häufig verwendete Methode besteht darin, das synchronisierte Schlüsselwort zu verwenden, um die Synchronisationsmethode zu ändern.
Modell des Client -Objekts
Paket com.lxk.threeTest.bank;/*** Kunde, implementieren Sie die Runnable () -Schinschnittstelle und mehrere Personen können Geld zusammen sparen Bank*/Private Bank Bank;/***Betriebstyp für Geld, Sparen oder Abhebung*/privater String -Typ;/***Die Anzahl der Operationen ist theoretisch eine positive Nummer*/private int time;/***Wie viel zu sparen oder abzutreten*/privat int ond usw. public customer () {} öffentliche Kunde (Bank Bank, String -Typ, int Zeit, int Geld) {this. tht the. money;}@Override public void run() {for (int x = 0; x < time; x++) {if (TYPE_ADD.equals(type)) {bank.add(money);} else if (TYPE_REDUCE.equals(type)) {bank.reduce(money);}}}}Da viele Kunden gleichzeitig auf eine Bank zugreifen können, wird der Betrieb des Sparens und Abhebens von Geld unter Verwendung von Threads implementiert.
Das Attribut ist konstruiert, um den Wert zu übergeben.
Hauptmethode
Paket com.lxk.threadtest.bank;/** * multi-thread-Instanz der Bankablagerung Geld * <p> * [Anforderungen:] * Die Bank hat einen Gewölbe. * Es gibt zwei Einleger, die n * 100 zurückzahlen oder abheben. * Zweck: Gibt es ein Sicherheitsproblem mit diesem Programm? Wenn ja, wie kann man es lösen? * <p> * [So finden Sie das Problem:] * 1. Löschen Sie, welche Codes Multi-Thread-Codes sind. * 2. Teile Daten eindeutig. * 3. Löschen Sie welche Anweisungen im Multi-Thread-Code mit gemeinsam genutzten Daten arbeiten. * * @author lxk on 2017/6/26 */public class Main {public static void main(String[] args) {//One bank and multiple customers Bank bank = new Bank();int time = 10000;int money = 100;//This customer saves money Customer c1 = new Customer(bank, Customer.TYPE_ADD, time, money);//This customer withdraws money Customer c2 = new Customer(bank, Customer.Type_reduce, Zeit, Geld); Thread t1 = neuer Thread (C1); Thread T2 = neuer Thread (C2); t1.start (); t2.Start ();}}Der tatsächliche Betriebseffekt des obigen Codes ist in der folgenden Abbildung dargestellt.
Wenn die Anzahl der Einzahlungen und Abhebungen von Geld gering ist, können Sie sehen, dass die beiden Threads eine Sequenz haben. Daher haben wir eine größere Häufigkeit. Dann werden wir die Situation sehen, wie in der Abbildung gezeigt. Thread 1 zieht Geld ab, und wenn Thread 0 Geld spart, können Sie feststellen, dass die beiden Threads mit Speicher und Auszahlung verschoben werden und kein Muster vorhanden sind.
Dies stellt die Datensynchronisation sicher.
Wie man außerhalb der Synchronisation ist, das heißt abnormale Phänomene,
Sie können das synchronisierte Schlüsselwort der Methode hinzufügen, die Häufigkeit reduzieren und auf dreimal ändern und den Anfangswert der Summe auf 0 einstellen. Versuchen Sie den Code erneut.
Sie finden das sogenannte asynchrisches Phänomen.
Das Ergebnis der Out-of-Synchronisierung auf der rechten Seite der obigen Abbildung ist, dass die beiden Personen jedes Mal dreimal 100 sparen. Ist die Gesamtzahl erhalten? 100.200.300.400.500.600. Es dauert lange.
Das Betriebsergebnis ist jedoch nicht
Wenn Sie zu diesem Zeitpunkt der Methode hinzufügen synchronisiert sind, wird das Ergebnis des Diagramms links angezeigt, was das richtige Ergebnis ist.
Ich fügte eine andere Methode für Existenz und Rückzug hinzu. Der Code wird zu dem, was er oben aussieht.
Dies sind fast alle Beispiele für die Synchronisation zwischen Thread.
Ich werde den Code kurz aufzeichnen. Bei der Verwendung können Sie es in wenigen Minuten herausnehmen.
Zusammenfassen
Das obige ist der vollständige Code dieses Artikels zum Simulieren von Java -Multithread -Synchronisationsproblemen mithilfe von Bankauszahlungen als Beispiel. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf diese Seite verweisen:
Java Multithread -Programmierbeispiel
Das Prinzip und die Umsetzung des Timer -Timer -Timers von Java Multithread
Java versteht Multi-Threading, indem er Tickets verkauft
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!