每次我使用监视器运行以下多线程代码时,我都会收到异常。
http://pastebin.com/jTGR98W9 http://pastebin.com/hKvuDX2d
每次我执行一个条件信号时,我都会得到一个异常,它说它应该是独占的,但它是独占的,因为它是同步的。或者我做错了什么?
由于
答案 0 :(得分:2)
您正在将旧的内部锁及其信号机制(synchronized
,wait
和notify
)与新的Lock
和Condition
类混合使用,尽管他们没有任何关系。这是一个混乱的来源,所以我坚持其中一个(最好是Lock
和Condition
)。
您的问题可能是由于在您拨打signal()
时没有按住与该条件相关联的锁定。通过调用lock()
和unlock():
public void canEat(String name) {
lock.lock();
try {
eaters.add(name);
if (eaters.size() > 0) {
canFeed.signal();
}
} finally {
lock.unlock();
}
}
其他synchronized
方法也需要做同样的事情。