2013-02-12 2 views
4

Я использовал, чтобы написать synchronized блок, как:Is notifyAll() требуется в конце синхронизированного блока?

synchronized(foobar) { 
    // do something 
} 

Но, в последнее время я видел, кто-то пишут:

synchronized(foobar) { 
    // do something 
    foobar.notifyAll(); 
} 

Is foobar.notifyAll(); необходимо? Что произойдет, если я опустил это?

+1

Здесь необходимо предотвратить взаимоблокировки –

+0

AMR, 'synchronized' для предотвращения взаимоблокировок,' notifyAll() 'используется для сигнализации любых других потоков, ожидающих на мониторе. –

+0

Но не мертвый замок, когда все потоки ждут и нет уведомления? –

ответ

1

NotifyAll() указывает любой другой поток, спящий в foobar.wait(), что текущий поток собирается освободить блокировку, и они могут снова конкурировать за ресурс.

2

Короткий ответ: это зависит от того, что вы делаете.

Если цель синхронизированного блока заключается в том, чтобы обеспечить безопасное выполнение доступа/обновления к структуре данных, то 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 на том же объекте мьютекс/блокировки.

Смежные вопросы