Thread-Synchronisation und gegenseitiger Ausschlussmechanismus in Java
In Java ist Multithreading eine wichtige Technologie. Um mehrere Aufgaben gleichzeitig effizient auszuführen, müssen Sie die Synchronisations- und Kooperationsmechanismen zwischen Threads beherrschen. In diesem Artikel werden die Thread-Synchronisation und der gegenseitige Ausschlussmechanismus in Java vorgestellt.
Thread-Synchronisation bedeutet, dass mehrere Threads zusammenarbeiten, um bestimmte Aufgaben während der Ausführung zu erledigen. Von mehreren Threads ausgeführte Codesegmente greifen gegenseitig auf gemeinsam genutzte Ressourcen zu. Nachdem ein Codesegment ausgeführt wurde, kann nur ein Thread auf die gemeinsam genutzten Ressourcen zugreifen und andere Threads müssen warten. Die Thread-Synchronisation folgt den folgenden Grundprinzipien:
(1) Atomarität: Auf einen bestimmten Codeabschnitt kann jeweils nur ein Thread zugreifen.
(2) Wiedereintritt: Wenn ein Thread einen synchronisierten Block mehrmals ausführt, wird er nicht gesperrt, da er die Sperre bereits hält.
In Java gibt es zwei Möglichkeiten, die Synchronisierung aufrechtzuerhalten: synchronisiert und gesperrt.
1.1 synchronisiert
synchronisiert ist der grundlegendste Synchronisierungsmechanismus in Java. Das Format des synchronisierten Synchronisationsblocks lautet wie folgt:
synchronisiert (Objekt) {
//Codesegment
}
Dabei ist das Objekt eine gemeinsam genutzte Ressource, die synchronisiert werden muss, z. B. die Methode des Objekts oder das Objekt selbst. Nur ein Thread kann gleichzeitig auf den durch das synchronisierte Schlüsselwort geänderten Codeblock zugreifen. Zum Beispiel:
public synchronisiert void method(){
//代码
}
Im obigen Codebeispiel wird die Methode method() mit dem synchronisierten Schlüsselwort geändert, und nur ein einzelner Thread kann diese Methode gleichzeitig ausführen. Beim Multithreading kann sichergestellt werden, dass die Threads, die auf diese Methode zugreifen, synchronisiert sind.
1.2 Sperre
Der Sperrmechanismus bietet eine detailliertere Sperrsteuerung. Lock ist eine Schnittstelle in Java, die über ReentrantLock, eine Unterklasse der Lock-Schnittstelle, implementiert wird. Die Verwendung von Lock-Sperren ähnelt in gewisser Weise dem synchronisierten Schlüsselwort, ist jedoch flexibler in der Verwendung. Bei Verwendung des Sperrmechanismus sind die Codesegmente, die zum Erlangen und Freigeben der Sperre erforderlich sind, in den Codeblöcken „try“ und „finally“ enthalten. Zum Beispiel:
Lock lock = new ReentrantLock();
lock.lock();
try {
//代码段
} endlich {
lock.unlock();
}
Im obigen Code wird die lock()-Methode zum Sperren verwendet Gemeinsam genutzte Ressource. Verwenden Sie die Methode unlock(), um die Sperre aufzuheben. Da der Sperrmechanismus über eine feinkörnigere Sperrsteuerung verfügt, eignet er sich besser für bestimmte Hochleistungssituationen.
Der gegenseitige Ausschlussmechanismus bezieht sich darauf, sicherzustellen, dass während der Multi-Thread-Ausführung nur ein Thread gleichzeitig auf gemeinsam genutzte Ressourcen zugreifen kann. In Java gibt es zwei Möglichkeiten, den gegenseitigen Ausschlussmechanismus zu implementieren: synchronisiert und gesperrt.
2.1 synchronisiert
Der synchronisierte synchronisierte Block kann nicht nur eine Thread-Synchronisierung erreichen, sondern auch einen gegenseitigen Ausschlussmechanismus implementieren. Das Codebeispiel für die Verwendung von synchronisiert zum Implementieren des gegenseitigen Ausschlussmechanismus lautet wie folgt:
public synchronisiert void method(){
//代码段
}
Im obigen Code wird das synchronisierte Synchronisierungsschlüsselwort vor der Methode hinzugefügt, um sicherzustellen, dass at Gleichzeitig kann nur ein Thread auf diesen Code zugreifen, wodurch ein gegenseitiger Ausschlussmechanismus implementiert wird.
2.2 Sperren
Mithilfe des in der LockAPI-Bibliothek bereitgestellten gegenseitigen Ausschlussmechanismus kann auch der gegenseitige Ausschlussmechanismus implementiert werden. Das Codebeispiel für die Verwendung des Sperrmechanismus zum Implementieren des gegenseitigen Ausschlussmechanismus lautet wie folgt:
private final Lock lock = new ReentrantLock();
public void method() {
lock.lock(); try { //代码段 } finally { lock.unlock(); }
}
Im obigen Code die Sperre Die ()-Methode wird zum Sperren der freigegebenen Ressourcen verwendet. Verwenden Sie die unlock()-Methode, um die Sperre aufzuheben und so den gegenseitigen Ausschlussmechanismus zu realisieren.
Sowohl der synchronisierte synchronisierte Block als auch der Sperrmechanismus können Thread-Synchronisation und Mechanismen zum gegenseitigen Ausschluss implementieren, es gibt jedoch einige Unterschiede zwischen den beiden.
(1) Unterschiedliche Granularität: Der synchronisierte Synchronisationsblock hat eine größere Granularität, während der Sperrmechanismus über die Sperrschnittstelle eine kleinere Granularität bietet. Mit dem Sperrmechanismus können Sie personalisiertere Sperren definieren und gleichzeitig steuern die Freigabe der Sperre.
(2) Unterschiedliche Sichtbarkeit: Wenn ein synchronisierter Synchronisationsblock verwendet wird und ein Thread die Sperre besitzt, kann der andere Thread die Sperre nicht sehen, sodass er die Freigabe der Sperre nicht unabhängig steuern kann. Wenn ein Thread mithilfe des Sperrmechanismus die Sperre erhält, ist die Sperre für alle Threads sichtbar und kann die Freigabe der Sperre steuern.
Zusammenfassend lässt sich sagen, dass die Thread-Synchronisation und der gegenseitige Ausschlussmechanismus in Java sehr wichtige Mechanismen in der Multithread-Programmierung sind. Unterschiedliche Anwendungsszenarien erfordern die Verwendung unterschiedlicher Synchronisations- und gegenseitiger Ausschlussmechanismen. Durch die Auswahl des geeigneten Mechanismus kann die Ausführungseffizienz von Multithread-Anwendungen erheblich verbessert werden.
Das obige ist der detaillierte Inhalt vonThread-Synchronisation und gegenseitiger Ausschlussmechanismus in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!