Heim >Java >javaLernprogramm >Java-Thread-Synchronisation und gegenseitiger Ausschluss: Von Grund auf neu beginnen und effiziente gleichzeitige Programme erstellen
Java-Thread-Synchronisation und gegenseitiger Ausschluss sind der Schlüssel zum Schreiben effizienter gleichzeitiger Programme. Mit dem PHP-Editor Banana erkunden Sie den Thread-Synchronisationsmechanismus in Java von Grund auf und können so auf einfache Weise effiziente und stabile gleichzeitige Programme erstellen und die Codequalität und -leistung verbessern.
In Java sind Thread-Synchronisierung und gegenseitiger Ausschluss Techniken, um sicherzustellen, dass keine Datenrennen oder andere Inkonsistenzen auftreten, wenn mehrere Threads Daten gemeinsam nutzen. Thread-Synchronisierung bedeutet, dass mehrere Threads, wenn sie auf gemeinsam genutzte Daten zugreifen, ihren Zugriff über einen Mechanismus koordinieren, um die Konsistenz und Integrität der Daten sicherzustellen. Gegenseitiger Thread-Ausschluss bedeutet, dass nur ein Thread auf gemeinsam genutzte Daten zugreifen kann und andere Threads nur warten können.
Eine Vielzahl von Thread-Synchronisationsmechanismen werden in Java bereitgestellt, die gebräuchlichsten davon sind Sperren und Monitore. Sperren sind ein Synchronisierungsmechanismus auf niedriger Ebene, der es einem Thread ermöglicht, eine Sperre zu erwerben, bevor er einen kritischen Abschnitt betritt (d. h. den Codeblock, in dem sich gemeinsam genutzte Daten befinden) und die Sperre aufzuheben, nachdem er den kritischen Abschnitt verlassen hat. Der Monitor ist ein fortschrittlicher Synchronisationsmechanismus, der Sperren und Bedingungsvariablen kombiniert, sodass Threads ruhen können, während sie auf die Sperre warten, bis die Sperre aufgehoben wird.
Um die Java-Thread-Synchronisierung und den gegenseitigen Ausschluss besser zu verstehen, schauen wir uns ein einfaches Codebeispiel an. In diesem Beispiel haben wir zwei Threads, die gleichzeitig auf eine gemeinsam genutzte Variable zugreifen. Wenn keine Thread-Synchronisation erfolgt, ist es sehr wahrscheinlich, dass zwei Threads gleichzeitig die gemeinsam genutzten Variablen ändern, was zu Dateninkonsistenzen führt.
public class SimpleSyncDemo { private int sharedVariable = 0; public void incrementSharedVariable() { sharedVariable++; } public static void main(String[] args) { SimpleSyncDemo demo = new SimpleSyncDemo(); Thread thread1 = new Thread(() -> { for (int i = 0; i < 100000; i++) { demo.incrementSharedVariable(); } }); Thread thread2 = new Thread(() -> { for (int i = 0; i < 100000; i++) { demo.incrementSharedVariable(); } }); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Shared variable value: " + demo.sharedVariable); } }
In diesem Beispiel verwenden wir Sperren, um gemeinsam genutzte Variablen zu synchronisieren. Wir erstellen zunächst ein Sperrobjekt, erwerben dann in jedem Thread die Sperre, bevor wir den kritischen Abschnitt betreten, und geben die Sperre frei, nachdem wir den kritischen Abschnitt verlassen haben. Auf diese Weise stellen wir sicher, dass nur ein einzelner Thread auf die gemeinsam genutzte Variable zugreifen kann, und vermeiden so Datenwettlaufprobleme.
Der gegenseitige Ausschluss von Java-Threads bedeutet, dass nur ein Thread auf gemeinsam genutzte Daten zugreifen kann und andere Threads nur warten können. Der einfachste Weg, einen gegenseitigen Thread-Ausschluss zu erreichen, ist die Verwendung einer Mutex-Sperre (Mutex). Ein Mutex ist eine spezielle Art von Sperre, die es nur einem Thread ermöglicht, die Sperre zu erhalten, und andere Threads können nur auf die Freigabe der Sperre warten.
Um den Java-Thread-Mutex besser zu verstehen, schauen wir uns ein einfaches Codebeispiel an. In diesem Beispiel haben wir zwei Threads, die gleichzeitig auf eine gemeinsam genutzte Variable zugreifen. Wenn es keinen gegenseitigen Thread-Ausschluss gibt, ist es sehr wahrscheinlich, dass zwei Threads die gemeinsam genutzten Variablen gleichzeitig ändern, was zu Dateninkonsistenzen führt.
public class SimpleMutexDemo { private final Object lock = new Object(); private int sharedVariable = 0; public void incrementSharedVariable() { synchronized (lock) { sharedVariable++; } } public static void main(String[] args) { SimpleMutexDemo demo = new SimpleMutexDemo(); Thread thread1 = new Thread(() -> { for (int i = 0; i < 100000; i++) { demo.incrementSharedVariable(); } }); Thread thread2 = new Thread(() -> { for (int i = 0; i < 100000; i++) { demo.incrementSharedVariable(); } }); thread1.start(); thread2.start(); try { thread1.join(); thread2.join(); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("Shared variable value: " + demo.sharedVariable); } }
In diesem Beispiel verwenden wir eine Mutex-Sperre, um einen gegenseitigen Thread-Ausschluss zu erreichen. Wir erstellen zuerst ein Mutex-Objekt, dann erfassen wir in jedem Thread den Mutex, bevor wir den kritischen Abschnitt betreten, und geben den Mutex frei, nachdem wir den kritischen Abschnitt verlassen haben. Auf diese Weise stellen wir sicher, dass nur ein Thread auf die gemeinsam genutzte Variable zugreifen kann, und vermeiden so Datenwettlaufprobleme.
Thread-Synchronisation und gegenseitiger Ausschluss sind wesentliche Grundkenntnisse in JavaConcurrent Programming. Die Beherrschung dieser Technologien kann uns helfen, effiziente und zuverlässige „Parallelitäts“-Programme zu schreiben. In diesem Artikel haben wir die Grundlagen der Java-Thread-Synchronisierung und des gegenseitigen Ausschlusses vorgestellt und anhand von Codebeispielen gezeigt, wie diese Techniken zum Schreiben gleichzeitiger Programme verwendet werden können.
Das obige ist der detaillierte Inhalt vonJava-Thread-Synchronisation und gegenseitiger Ausschluss: Von Grund auf neu beginnen und effiziente gleichzeitige Programme erstellen. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!