Java: notify() vs. notifyAll() Revisited
Obwohl oft behauptet wird, dass notify() nur einen wartenden Thread und notifyAll weckt () weckt alle wartenden Threads, das Verständnis ihrer praktischen Auswirkungen ist von entscheidender Bedeutung.
Kernunterschied
Beide Methoden wecken wartende Threads, aber jeweils nur einem Thread wird die Monitorerfassung gewährt Zeit, unabhängig von der verwendeten Methode. Dieser Auswahlprozess ist nicht deterministisch und hängt von der VM oder dem zugrunde liegenden System-Thread-Scheduler ab.
Der Wert von notifyAll()
In den meisten Szenarien sollte notifyAll() dies tun über notify() eingesetzt werden. Wenn notify() verwendet wird, kann nur ein Thread zur Ausführung ausgewählt werden. Dies kann zu Deadlocks führen, wie im folgenden Beispiel gezeigt:
public class ProducerConsumerBroken { private Object[] buf; public synchronized void put(Object o) { while (buf.length == MAX_SIZE) wait(); buf[next] = o; notify(); } public synchronized Object get() { while (buf.length == 0) wait(); return buf[next--]; } }
In diesem Beispiel kann notify() zu einem Deadlock führen, da der System-Thread-Scheduler möglicherweise kontinuierlich einen Thread bevorzugt, während andere Threads auf unbestimmte Zeit angehalten bleiben.
Deadlock-Vermeidung mit notifyAll()
Durch die Verwendung von notifyAll() werden alle wartenden Threads (falls vorhanden) aufgeweckt, sodass jeder Thread eine unparteiische Chance erhält, die Sperre zu erhalten und fahren Sie fort. Dadurch wird die Möglichkeit von Deadlocks ausgeschlossen.
Wann ist notifyAll() zu verwenden?
Verwenden Sie notifyAll() immer dann, wenn Sie sicherstellen möchten, dass alle wartenden Threads darüber informiert werden, dass das Objekt, das sie haben Das Warten hat sich geändert. Dies ist besonders wichtig in Fällen, in denen Sie nicht vorhersagen können, welcher Thread benachrichtigt werden muss oder wenn möglicherweise mehrere Threads auf dieselbe Sperre warten.
Empfehlung
Im Allgemeinen Als Faustregel gilt: Verwenden Sie immer notifyAll(). Dies verhindert potenzielle Deadlocks und sorgt für Fairness bei der Thread-Planung.
Das obige ist der detaillierte Inhalt vonWann sollten Sie „notifyAll()' in Java verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!