Als ich diese Frage zum ersten Mal sah, konnte ich nicht anfangen, weil ich das Gefühl hatte, dass synchronisiert und Sperre in Bezug auf das Sperren sehr unterschiedlich waren. Sehen Sie zum Beispiel, wie Sie unter normalen Umständen synchronisiert werden können.
Methode 1:
public synchronisierte void a () {// Todo}Methode 2:
public void b () {synchronisiert (this) {// Todo}}Aus diesen beiden Arten wird das Schloss zwischen {} hinzugefügt. Schauen wir uns an, wie das Schloss gemacht wird:
public void c () {lock.lock (); try {// Todo} endlich {lock.unlock (); }}Diese Sperrweise wird zwischen Lock () und Unlock () hinzugefügt. Wenn Sie also eine Sperrfunktion implementieren möchten, müssen Sie überlegen, wie Sie diese beiden Methoden implementieren, lock () und entsplock () () () und definieren Sie zunächst ein Framework wie folgt:
public void lock () {} public void Unlock () {}Dann müssen Sie überlegen, wie Sie synchronisiert werden, um diese beiden Methoden zu implementieren.
Jetzt bin ich nur ein wenig klarer, aber ich weiß nicht, wie ich diese beiden Methoden füllen soll. Hier erfahren Sie, wie Sie die Eigenschaften von Locks Sperren analysieren und sich diesen Code ansehen:
public void c () {lock.lock (); // Wenn der aktuelle Thread die Sperre erhalten, muss ein anderer Thread versuchen.Ich habe gerade einen kleinen Kommentar zu diesem Code hinzugefügt und nichts anderes getan. Hilft es, diesen Code zu verstehen und zu sehen, was das häufigste Wort ist, CurrentThread? Wenn wir also die Methoden lock () und entsplock () ausfüllen, sollten wir darauf achten, das CurrentThread -Schlüsselwort zu erfassen, um die Lösung zu finden? Die Antwort lautet ja.
Analysieren Sie dann, wie Sie den Thread warten lassen, wenn Sie synchronisiert werden? Es soll die Wait () -Methode verwenden. Wie wecke ich den Thread auf? Es verwendet die melden () -Methode. Anschließend müssen Sie die Wait () -Methode in der Lock () -Methode und in der Methode "benachrichtigen () in der Methode Unlock () verwenden. Wenn wir also Wait () und benachrichtigen () verwenden, haben wir eine Erkrankung. Denken Sie darüber nach, was wir als Bedingung verwenden sollen?
Wir sollten verwenden, ob das aktuelle Schloss als Urteilsbedingung besetzt ist. Wenn das Schloss besetzt ist, warten Sie. Überlegen Sie, ob wir diese Erkrankung bei der Verwendung von Synchronisierten verwendet haben. Die Antwort lautet ja.
Lassen Sie uns analysieren, wann das Schloss freigegeben werden soll und welche Bedingungen verwendet werden. Überlegen Sie, ob Thread A das Schloss erhält, kann Thread B veröffentlicht werden? Natürlich nicht. Wenn B veröffentlicht werden kann, verstößt es natürlich nicht gegen das Prinzip. Es ist definitiv, dass das Schloss von Thread A nur veröffentlicht werden kann. Daher besteht die Beurteilungsbedingung darin, zu beurteilen, ob der Thread, der das Schloss hält, aktuell ist. Wenn ja, kann es veröffentlicht werden, aber natürlich kann es nicht.
Schauen wir uns jetzt den kompletten Code an:
Paket test.lock; import Java.util.random; import Java.util.concurrent.executorService; Import Java.util.Concurrent Keine;} public synchronisierte void lock () {long currentThreadid = thread.currentThread (). GetId (); if (Eigentümer == CurrentThreadid) {neue illegale stateException ("lock wurde durch aktuelle Thread erfasst");}, während (this.islooked ()) {system. {Wait ();} catch (interruptedException e) {e.printstacktrace ();}}} Eigentümer = CurrentThreadid; System.out.println (String.Format ("Lock wird von Thread %s", Inhaber); IllegalStateException ("Nur Lock -Eigentümer kann das Schloss entsperren");} System.out.println (string.format ("Thread %s entriegelt", Eigentümer); System.out.println (); Eigentümer = keine; notify ();} public static void Main (String [] args) {final Naival lock = new Naival (). Executors.NewFixed threadpool (20, neuer ThreadFactory () {private ThreadGroup Group = New ThreadGroup ("Test Thread Group"); {@Override public void run () {lock.lock (); System.out.println (string.format ("Thread %s läuft ...", Thread.currentThread (). {e.printstacktrace ();} lock.unlock ();}});}}}Führen Sie es aus und sehen Sie die Ergebnisse:
Lock wird von Thread 8 Gewinde 8 ausgeführt ... Thread 27 Wartet Lock Thread 26 Wartet Lock Thread 25 Waites Lock Thread 24 Wartet Lock Thread 23 Wartet Lock Thread 22 Wartet Lock Thread 21 Wartet Lock Thread 20 Wartet Lock -Gewinde 19 Wartet Lock -Gewinde 18 War Ward Warted Lock -Gewinde wartet, Wartesperrwäsche wartet. Lock -Gewinde wartet. Lock -Gewinde wartet. Lock -Gewinde. 27 Thread 27 läuft Thread 20 Thread 20 läuft Mit Thread 13 Thread 13 läuft ... Thread 13 wird entsperrt von Thread 12 Thread 12 läuft
Wenn Sie die für die Schleife auf 30 Mal ändern, schauen Sie sich die Ergebnisse an:
Lock wird von Thread 8 Gewinde 8 ausgeführt ... Thread 27 Wartet Lock Thread 26 Wartet Lock Thread 25 Waites Lock Thread 24 Wartet Lock Thread 23 Wartet Lock Thread 22 Wartet Lock Thread 21 Wartet Lock Thread 20 Wartet Lock -Gewinde 19 Wartet Lock -Gewinde 18 War Ward Warted Lock -Gewinde wartet, Wartesperrwäsche wartet. Lock -Gewinde wartet. Lock -Gewinde wartet. Lock -Gewinde. 27 Thread 27 läuft ... Thread 8 wartet Lock Thread 27 lockert die Sperre erfasst durch Thread 27 Thread 27 wird ausgeführt ... Thread 26 Wartet Lock Thread 27 wird von Thread erfasst. Wartesschloss Thread 22 ist das Entsperren von Schloss wird von Thread 22 Thread 22 ausgeführt ... Thread 21 Wartet Lock Thread 22 ist das Entsperren von Sperre erfasst durch Thread 22 Thread 22 läuft Thread 16 Thread 16 läuft ... Thread 16 wird entsperrt von Thread 15 Thread 15 läuft nach Thread 9 Thread 9 läuft ... Thread 9 lockert die Lock -Lock erfasst durch Thread 8 Thread 8 wird ausgeführt. Thread 8 wird entsperrt wird durch Thread 26 Thread 26 läuft Erfasst von Thread 21 Thread 21 läuft
Zusammenfassen
Das obige ist die detaillierte Erläuterung dieses Artikels zur Verwendung von Synchronisierungen zur Implementierung eines Sperrcode. Ich hoffe, es wird für alle hilfreich sein. Interessierte Freunde können weiterhin auf diese Seite verweisen:
Java -Thread -Synchronisationsschloss -Synchronisationssperrcode
Der Unterschied zwischen synchronisiert und sperren bei der Java -Programmierung [empfohlen]
Java Multithread-ReadWriteLock-Les-Schreib-Trennungsimplementierungscode
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!