我正在阅读Condition
个对象以及它们如何为每个对象提供多个等待集,以及区分哪个对象或一组对象/线程获得特定信号。
为什么常规Object
没有这样做?例如。
而不是:
final Condition notFull = lock.newCondition();
final Condition notEmpty = lock.newCondition();
lock.lock();
try {
while (count == items.length)
notFull.await();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.signal();
我们这样做:
final Object notFull = new Object();
final Object notEmpty = new Object();
lock.lock();
try {
while (count == items.length)
notFull.wait();
items[putptr] = x;
if (++putptr == items.length) putptr = 0;
++count;
notEmpty.notify();
难道我们还没有多个等待集并区分通知的线程吗?
答案 0 :(得分:3)
在您的示例中,您在一个锁上创建了2个条件。这是内置同步无法做到的 - 你必须使用2个对象来获得2个条件。
你的第二个代码坏了,因为你没有锁定notFull和notEmpty但是调用wait / notify - 你将得到IllegalMonitorStateException。但如果你试图锁定它们,你会发现你不能同时做到这一点。这是差异
答案 1 :(得分:1)
在致电synchronize
或wait
时,您需要先notify
。当您需要两个不同的集合时,需要两个对象才能同步。嵌套同步会给你死锁。
答案 2 :(得分:0)
不行。您必须拥有对象的监视器才能使用其notFull.wait()
方法。即使它被允许,它仍然不会释放lock
,因此没有其他线程可以访问它。