条件vs对象等待/通知

我正在阅读有关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(); 

我们还没有多个等待集并区分通知的线程吗?

在您的示例中,您在一个锁上创建了2个条件。 这是内置同步无法做到的 – 你必须使用2个对象来获得2个条件。

你的第二个代码被破坏了,因为你没有锁定notFull和notEmpty但是调用wait / notify – 你将得到IllegalMonitorStateException。 但如果你试图锁定它们,你会发现你不能同时做到这一点。 这是不同的

在调用waitnotify时,您需要先synchronize 。 当您需要两个不同的集合时,需要两个对象进行同步。 嵌套同步会给你死锁。

这不好。 您必须拥有对象的监视器才能使用其notFull.wait()方法。 即使它被允许它仍然不会释放lock ,因此没有其他线程可以访问它。