Heim  >  Artikel  >  Java  >  Wie erreicht man Thread-Sicherheit in synchronisierten Blöcken von Java-Funktionen?

Wie erreicht man Thread-Sicherheit in synchronisierten Blöcken von Java-Funktionen?

王林
王林Original
2024-05-01 21:15:01602Durchsuche

Der synchronisierte Block von Java-Funktionen erreicht Thread-Sicherheit, indem er Synchronisationssperren erhält. Wenn ein Thread den synchronisierten Block betritt, können andere Threads nicht eintreten, wodurch sichergestellt wird, dass der Zugriff auf gemeinsam genutzte Daten threadsicher ist. Spezifische Schritte: Deklarieren Sie eine synchronisierte Methode oder einen synchronisierten Codeblock und verwenden Sie das synchronisierte Schlüsselwort. Wenn ein Thread einen synchronisierten Block betritt, erhält er eine Synchronisationssperre. Andere Threads können nicht auf die Daten im synchronisierten Block zugreifen, bis der erste Thread die Synchronisationssperre aufhebt. Ein synchronisierter Block enthält nur den Code, der synchronisiert werden muss.

Java 函数的同步块如何实现线程安全?

Wie erreicht man Thread-Sicherheit in synchronisierten Blöcken von Java-Funktionen?

Synchronisierte Blöcke sind syntaktischer Zucker, der verwendet wird, um nicht-threadsichere Funktionen in einer Multithread-Umgebung threadsicher zu machen. Es handelt sich im Wesentlichen um eine Mutex-Sperre. Wenn ein Thread einen synchronisierten Block betritt, erhält er die synchronisierte Sperre, und kein anderer Thread kann in den synchronisierten Block eintreten, bis dieser Thread die Sperre aufhebt.

Syntax

public synchronized void myFunc() {
    // 临界区代码
}

Praktischer Fall

Angenommen, wir haben eine nicht threadsichere Funktion increment(), die einen Zählerwert um 1 erhöht. Wenn mehrere Threads diese Funktion gleichzeitig aufrufen, ist der Zählerwert möglicherweise falsch. Wir können synchronisierte Blöcke verwenden, um dieses Problem zu lösen: increment(),它将一个计数器值加 1。如果多个线程同时调用此函数,则计数器值可能会发生错误。我们可以使用同步块来解决这个问题:

private int counter;

public synchronized void increment() {
    counter++;
}

这样,当一个线程调用 increment() 函数时,它会获取对 counter 的独占锁。其他线程在第一个线程释放该锁之前都无法访问 counter,从而确保对 counter 的访问是线程安全的。

需要注意的是:

  • 只能使用 synchronizedrrreee
  • Auf diese Weise erhält ein Thread, wenn er die Funktion increment() aufruft, eine exklusive Sperre für counter. Kein anderer Thread kann auf counter zugreifen, bis der erste Thread die Sperre aufhebt, wodurch sichergestellt wird, dass der Zugriff auf counter threadsicher ist.
  • Es ist zu beachten, dass:
    • Sie können das Schlüsselwort synchronized nur zum Synchronisieren von Methoden oder Codeblöcken verwenden, nicht von Klassen.
    🎜Synchronisierte Blöcke sind nur innerhalb des Codeblocks gültig. Sobald ein Thread den synchronisierten Block verlässt, können andere Threads eintreten. 🎜🎜Verschachteln Sie synchronisierte Blöcke nicht in synchronisierten Blöcken, da dies zu einem Deadlock führen kann. 🎜🎜Versuchen Sie, die Synchronisierungsblöcke so klein wie möglich zu halten und nur den Code abzudecken, der synchronisiert werden muss. 🎜🎜

    Das obige ist der detaillierte Inhalt vonWie erreicht man Thread-Sicherheit in synchronisierten Blöcken von Java-Funktionen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

    Stellungnahme:
    Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn