尝试在synchronized语句中调用notifyAll()
时出现以下错误:在同步上下文之外调用Object.notify()。
示例:
final List list = new ArrayList();
synchronized(list) {..... invoked notifyAll() here};
答案 0 :(得分:5)
您只能在正在同步的对象上调用wait()
,notify()
和notifyAll()
:
synchronized (list) {
//...
list.notifyAll();
}
换句话说,调用线程必须拥有对象的监视器。
如果在synchronized (list)
内拨打notifyAll()
,您实际上是在notifyAll()
而不是this
上致电list
。
答案 1 :(得分:1)
我的猜测是你在另一个对象上调用notifyAll()
,一个你没有锁定的对象。在您的示例中,您可以在notifyAll()
上致电list
,但不能在this
上致电。
答案 2 :(得分:1)
线程必须拥有对其调用wait,notify,notifyAll的对象的锁定。在你发布的代码中,线程拥有'list'上的锁,然后它在'this'对象上调用notifyAll。