Zum Hauptinhalt springen

So rufen Sie die Objektsynchronisierungsmethode für einen unsynchronisierten Codeblock auf

In der Programmierung wird Multithreading häufig verwendet, um die Anwendungsleistung zu erhöhen. Wenn Sie jedoch mit mehreren Threads arbeiten, kann die Änderung von Freigaben zu unvorhersehbaren Fehlern führen. Um solche Probleme zu vermeiden, wird ein Objektsynchronisierungsmechanismus verwendet.

Eine Möglichkeit, die Synchronisierung sicherzustellen, besteht darin, ein Schlüsselwort zu verwenden synchronized. Dadurch wird sichergestellt, dass zu einem bestimmten Zeitpunkt nur ein Thread auf diesen Codeblock zugreifen kann. Manchmal ist es jedoch notwendig, die Synchronisierungsmethode nicht innerhalb eines synchronisierten Codeblocks aufzurufen.

Sie können einen speziellen Mechanismus verwenden, das Synchronisierungsobjekt, um die Synchronisierungsmethode für Objekte in einem nicht synchronisierten Codeblock aufzurufen. Es ist ein Objekt, mit dem Sie die Threadsynchronisierung organisieren können. Das Synchronisierungsobjekt kann ein beliebiges Objekt sein, aber die häufigsten Schlüsselwörter sind synchronized und volatile.

Die Verwendung der Methode zum Synchronisieren von Objekten eines nicht synchronisierten Codeblocks hilft, Fehler zu vermeiden, die mit dem gleichzeitigen Zugriff mehrerer Threads auf freigegebene Ressourcen verbunden sind. Es ist ein wichtiges Werkzeug, mit dem Sie Aufgaben der parallelen Programmierung effektiv lösen können.

Was ist die Objektsynchronisierung

In Multithreadanwendungen müssen Sie den Zugriff auf freigegebene Daten synchronisieren, um den Race-Status zu vermeiden und korrekte Ergebnisse zu erzielen. Sie können dazu ein Schlüsselwort verwenden synchronized Damit können Sie den Zugriff auf einen Codeblock oder eine Methode auf einen einzelnen Ausführungsthread zu einem bestimmten Zeitpunkt einschränken.

Wenn Sie das Schlüsselwort synchronized für einen Codeblock oder eine Methode verwenden, richtet die JVM automatisch einen Monitor (auch als Sperre bezeichnet) für das Objekt ein, auf das die Synchronisierung angewendet wurde. Dies bedeutet, dass nur ein Ausführungsthread auf einen Codeblock oder eine Methode zugreifen kann, während die anderen Threads warten, bis der Monitor freigegeben wird.

Die Objektsynchronisierung stellt sicher, dass die Lese-/Schreibvorgänge der freigegebenen Daten atomar sind. Dies bedeutet, dass, wenn ein Ausführungsthread eine Schreiboperation ausführt, andere Threads warten müssen, bis sie abgeschlossen sind, und dann den aktuellen Wert der Daten abrufen.

Neben dem Schlüsselwort synchronized sind in Java auch andere Synchronisierungsmechanismen verfügbar, z. B. die Verwendung einer Klasse ReentrantLock aus dem Java-Paket.util.concurrent oder Methoden wait() und notify() Objekts.

Warum muss ich die Synchronisierungsmethode aufrufen

In einer Multithreadumgebung kann nicht synchronisierter Code zu Fehlern und undefiniertem Verhalten führen, die als Datenrennen bekannt sind. Datenrennen können auftreten, wenn zwei oder mehr Threads versuchen, die Freigabe gleichzeitig zu ändern, was zu unkonsistenten Ergebnissen und einem unvorhersehbaren Programmzustand führen kann.

Wenn Sie eine Synchronisierungsmethode wie synchronized in Java aufrufen, können Sie eine Sperre für ein Objekt festlegen, sodass nur ein Thread zu einem bestimmten Zeitpunkt auf den gesperrten Code zugreifen kann. Die anderen Threads müssen warten, bis die Sperre aufgehoben ist, bevor sie fortfahren können.

Die Verwendung der Synchronisierungsmethode hilft auch, potenzielle Probleme mit dem Wettbewerbszugriff auf freigegebene Ressourcen wie gemeinsame Variablen oder Dateien zu vermeiden. Es stellt sicher, dass ein Thread seine Arbeit mit der Ressource beendet, bevor andere Threads darauf zugreifen.

Außerdem kann das Aufrufen der Synchronisierungsmethode nützlich sein, wenn Sie mit kritischen Vorgängen arbeiten, die zu unvorhersehbaren Konsequenzen führen können, wenn mehrere Threads gleichzeitig ausgeführt werden. Durch das Sperren des Codes wird sichergestellt, dass diese Vorgänge nur nacheinander ausgeführt werden, über einen Thread hinweg.

So rufen Sie die Objektsynchronisierungsmethode auf

Methode zum Synchronisieren von Objekten synchronized in Java können Sie sicherstellen, dass nur ein Thread Code in einem bestimmten Synchronisierungsblock ausführt. Manchmal ist es jedoch notwendig, die Methode zum Synchronisieren von Objekten außerhalb des synchronisierten Codeblocks aufzurufen.

Führen Sie die folgenden Schritte aus, um die Methode zum Synchronisieren von Objekten außerhalb eines synchronisierten Codeblocks aufzurufen:

  1. Deklarieren Sie das Objekt, für das die Synchronisierungsmethode aufgerufen wird.
  2. Erstellen Sie einen Codeblock, in dem die Synchronisierungsmethode aufgerufen wird.
  3. Schlüsselwort verwenden synchronized bevor Sie die Methode aufrufen und das Objekt übergeben, für das eine Synchronisierung erforderlich ist.
public class ObjectSyncExample synchronizedMethod();>private static void synchronizedMethod() >>

Das obige Beispiel zeigt eine Synchronisierungsmethode synchronizedMethod() wird außerhalb des synchronisierten Codeblocks aufgerufen. Dazu in der Methode main() ein Synchronisierungsblock wird mit einem Objekt deklariert lock und dann wird die Methode aufgerufen synchronizedMethod() wieder mit demselben Objekt.

Um die Methode zum Synchronisieren von Objekten außerhalb eines synchronisierten Codeblocks aufzurufen, müssen Sie daher einen Codeblock mithilfe eines Schlüsselworts erstellen synchronized und übergeben Sie das Objekt, für das eine Synchronisierung erforderlich ist.

Beispiel für einen unsynchronen Codeblock

Betrachten Sie beispielsweise den folgenden Code:

public class UnsynchronizedBlockExample public void decrement() public static void main(String[] args) >);Thread thread2 = new Thread(() -> >);// Запуск потоковthread1.start();thread2.start();// Ожидание завершения потоковtry catch (InterruptedException e) // Вывод результатаSystem.out.println("Результат: " + example.counter);>>

In diesem Beispiel werden zwei Threads erstellt, von denen jeder eine eigene Operation für den Zähler ausführt. Da wir jedoch keinen Synchronisierungsmechanismus haben, kann das Ergebnis unvorhersehbar sein. Aufgrund des Race-Zustands ist der Zähler möglicherweise nicht gleich Null, obwohl nach Inkrement- und Dekrementoperationen erwartet wird, dass er gleich Null ist.

Um ein solches Multithreading-Problem zu vermeiden, müssen Sie den Zugriff auf freigegebene Ressourcen synchronisieren. In diesem Fall können Sie das Schlüsselwort synchronized verwenden, um einen Codeblock innerhalb der Methoden increment() und decrement() zu synchronisieren :

public void increment() >public void decrement() >

Jetzt wird ein Codeblock, der den Zählerwert ändert, nur von einem Thread gleichzeitig ausgeführt. Als Ergebnis können wir sicher sein, dass der Zählerwert korrekt geändert wird und es keinen Rennzustand gibt.