Короткий ответ: это зависит от того, что вы делаете.
Если цель синхронизированного блока заключается в том, чтобы обеспечить безопасное выполнение доступа/обновления к структуре данных, то notify()
или notifyAll()
не имеет никакой цели.
С другой стороны, если цель состоит в том, чтобы реализовать «переменное условие», то notify()
или notifyAll()
вызовов работают с wait
вызовом, как это ... например:
private boolean flag;
private final Object mutex = new Object();
public void awaitFlag(boolean flag) {
synchronized (mutex) {
while (this.flag != flag) {
mutex.wait();
}
}
}
public void setFlag(boolean flag) {
synchronized (mutex) {
this.flag = flag;
mutex.notifyAll();
}
}
выше реализует простой механизм, когда потоки звонят awaitFlag()
, чтобы дождаться flag
, чтобы стать true
или false
. Когда другой поток вызывает setFlag()
, чтобы изменить флаг, все потоки, которые в настоящее время ждут изменения флага, будут разбужены notifyAll()
. Это пример, когда notifyAll()
необходим для работы кода.
Итак, чтобы понять нужен ли notify
или notifyAll
код, вам необходимо выяснить, если какой-либо другой код Мощь вызов wait
на том же объекте мьютекс/блокировки.
Здесь необходимо предотвратить взаимоблокировки –
AMR, 'synchronized' для предотвращения взаимоблокировок,' notifyAll() 'используется для сигнализации любых других потоков, ожидающих на мониторе. –
Но не мертвый замок, когда все потоки ждут и нет уведомления? –