Die Java-Thread-Synchronisation steht grundsätzlich mit einer Logik: Fügen Sie Sperre hinzu -------> Modify ----------> Release-Sperre
1. Synchronisieren Sie Codeblöcke
Beispiele sind wie folgt:
öffentliche Klasse SyncBlock {statische Klasse datawrap {int i; } statische Klasse SyncBlockThread erweitert Thread {private DataWrap -Datum; public syncblockthread (datawrap datawrap) {this.date = datawrap; } @Override public void run () {für (int i = 0; i <10; i ++) {synchronized (Datum) {Date.i ++; versuche {schlaf (1); } catch (interruptedException e) {e.printstacktrace (); } System.out.println (getName () + "" + date.i); }}}} public static void main (string [] args) {// multi-thread-Implementierungsvariable i fügt eine Ausgabe in Sequence DataWrap DataWrap = new DataWrap () hinzu; New SyncBlockThread (DataWrap) .Start (); New SyncBlockThread (DataWrap) .Start (); New SyncBlockThread (DataWrap) .Start (); }}Im Beispiel möchten Sie Ganzzahlen nacheinander ausgeben.
Normalerweise sind Synchroncodeblöcke Objekte, die gesperrt werden müssen, und sind im Allgemeinen gemeinsame Ressourcen, die einen gleichzeitigen Zugriff erfordern. Jeder Thread sperrt zuerst die Ressource, bevor die angegebene Ressource geändert wird. Während der Sperrdauer können andere Threads die Ressource nicht ändern. Dies gewährleistet die Sicherheit von Threads. Darüber hinaus gibt der Thread das Ressourcenschloss nicht auf, wenn Sie Schlaf oder Ertrag aufrufen.
2. Synchronisationsmethode
öffentliche Klasse SyncMethod {statische Klasse DataWrap {int i; public synchronisierte void ValueGrow () {i ++; try {thread.sleep (1); } catch (InterruptedException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } System.out.println (Thread.currentThread (). GetName () + "" + i); }} statische Klasse SyncMethodthread erweitert Thread {datawrap datawrap; public syncMethodthread (datawrap datawrap) {thataWrap = datawrap; } @Override public void run () {für (int i = 0; i <10; i ++) {datawrap.ValuEgrow (); }}} public static void main (String [] args) {// Implementieren Sie sequentielles Wachstum und Ausgabe i datawrap datawrap = new DataWrap (); New SyncMetHodhread (DataWrap) .Start (); New SyncMetHodhread (DataWrap) .Start (); New SyncMetHodhread (DataWrap) .Start (); }}Die Synchronisationsmethode ist eine durch das synchronisierte Schlüsselwort modifizierte Methode. Die Synchronisationsmethode sperrt das Objekt selbst. Wenn ein Thread die Synchronisationsmethode eines bestimmten Objekts aufruft und andere Threads andere Synchronisationsmethoden des Objekts aufrufen, müssen er noch warten, um die Sperre des Objekts freizulassen, da das Objekt gesperrt wurde.
3. Synchronen Schloss
Die Synchronisation wird durch Definieren eines Synchronisationssperrobjekts erreicht. In diesem Fall verwendet die Synchronisationsschloss ein Sperrobjekt, um zu wirken.
importieren java.util.concurrent.locks.lock; import Java.util.concurrent int i; public void valueGrow () {lock.lock (); Versuchen Sie {i ++; try {thread.sleep (1); } catch (InterruptedException e) {// Todo automatisch generierter Catch-Block e.printstacktrace (); } System.out.println (Thread.currentThread (). GetName () + "" + i); } endlich {lock.unlock (); }}} statische Klasse SynclockThread erweitert Thread {datawrap datawrap; public synclockThread (datawrap datawrap) {this.datawrap = datawrap; } @Override public void run () {für (int i = 0; i <10; i ++) {datawrap.ValuEgrow (); }}} public static void main (String [] args) {// Implementieren Sie sequentielles Wachstum und Ausgabe i datawrap datawrap = new DataWrap (); neuer Synclockthread (DataWrap) .Start (); neuer Synclockthread (DataWrap) .Start (); neuer Synclockthread (DataWrap) .Start (); }}Die Verwendung von Sperrobjekten zum Implementieren der Threadsynchronisation ist flexibler. Einige Schlösser haben auch einige spezifische Funktionen, unter denen die häufiger verwendeten ReadWriteLock -Lesen und Schreiben von Sperren gelesen und schreiben, und Reentrantlock kann das Schloss wieder eingeben.