wait (), notify () и notifyAll () внутри синхронизированного оператора - PullRequest
4 голосов
/ 21 сентября 2011

Я получаю следующую ошибку при попытке вызвать notifyAll() внутри синхронизированного оператора: Вызванный Object.notify () вне синхронизированного контекста.

Пример:

final List list = new ArrayList();
synchronized(list) {..... invoked notifyAll() here};

Ответы [ 3 ]

5 голосов
/ 21 сентября 2011

Вы можете вызывать wait(), notify() и notifyAll() только для синхронизируемого объекта:

synchronized (list) {
    //...
    list.notifyAll();
}

Другими словами, вызывающий поток должен владеть монитором объекта.

Если внутри synchronized (list) вы звоните notifyAll(), вы на самом деле звоните notifyAll() на this вместо list.

1 голос
/ 21 сентября 2011

Поток должен владеть блокировкой объекта, который он вызывает: wait, notify, notifyAll on.В опубликованном вами коде поток владеет блокировкой «list», а затем вызывает notifyAll для объекта «this».

1 голос
/ 21 сентября 2011

Я предполагаю, что вы вызываете notifyAll() для другого объекта, для которого у вас нет блокировки. В вашем примере вы можете позвонить notifyAll() на list, но не на this.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...