Heim  >  Artikel  >  Java  >  Wie vermeiden Sie IllegalMonitorStateException bei Verwendung von Javas wait() und notify()?

Wie vermeiden Sie IllegalMonitorStateException bei Verwendung von Javas wait() und notify()?

Barbara Streisand
Barbara StreisandOriginal
2024-11-02 10:13:30449Durchsuche

How Do You Avoid IllegalMonitorStateException When Using Java's wait() and notify()?

Java Wait and Notify: IllegalMonitorStateException verstehen

In Java werden die Methoden wait() und notify() zum Synchronisieren von Threads verwendet. Bei unsachgemäßer Verwendung kann jedoch die IllegalMonitorStateException auftreten.

Problem

Der folgende Codeausschnitt zeigt ein einfaches Synchronisierungsproblem:

<code class="java">class Main {
    // ...
    public void wait() {
        // ...
    }
    public void notifyAll() {
        // ...
    }
}

class Runner implements Runnable {
    public void run() {
        try {
            Main.main.wait();
        } catch (InterruptedException e) {
            // ...
        }
    }
}</code>

In diesem Beispiel versucht der Runner-Thread, wait() für das Main-Objekt aufzurufen. Dies führt jedoch zu der Ausnahme, da der Runner-Thread nicht Eigentümer des mit dem Hauptobjekt verknüpften Monitors ist.

Grundlegendes zu synchronisierten Methoden

Verwendung von wait() und notify () muss der aktuelle Thread Eigentümer des Monitors des zu synchronisierenden Objekts sein. Dies kann erreicht werden, indem das Objekt mithilfe des Schlüsselworts synchronisiert synchronisiert wird.

Lösung

Um das Problem zu beheben, kann die Runner-Klasse wie folgt geändert werden:

<code class="java">class Runner implements Runnable {
    public void run() {
        try {
            synchronized(Main.main) {
                Main.main.wait();
            }
        } catch (InterruptedException e) {
            // ...
        }
    }
}</code>

Durch das Hinzufügen des synchronisierten Blocks um den Aufruf von wait() wird der Runner-Thread zum Besitzer des Monitors des Hauptobjekts und kann das Warten sicher durchführen Operation.

Gilt für notifyAll

Das gleiche Prinzip gilt für die Methoden notify() und notifyAll(). Sie müssen innerhalb eines synchronisierten Blocks des zu synchronisierenden Objekts aufgerufen werden. Daher kann die Hauptklasse wie folgt geändert werden:

<code class="java">class Main {
    // ...
    public synchronized void notifyAll() {
        // ...
    }
}</code>

Durch die Sicherstellung der ordnungsgemäßen Eigentümerschaft von Monitoren kann die Verwendung von wait() und notify() sicher implementiert werden, um Threads in Java zu synchronisieren.

Das obige ist der detaillierte Inhalt vonWie vermeiden Sie IllegalMonitorStateException bei Verwendung von Javas wait() und notify()?. 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