在synchronized语句中的wait(),notify()和notifyAll()

时间:2011-09-21 18:03:55

标签: java synchronization

尝试在synchronized语句中调用notifyAll()时出现以下错误:在同步上下文之外调用Object.notify()。

示例:

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

3 个答案:

答案 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。