Java 条件vs对象等待/通知
我正在阅读关于Java 条件vs对象等待/通知,java,multithreading,concurrency,Java,Multithreading,Concurrency,我正在阅读关于条件对象以及它们如何为每个对象提供多个等待集,以及如何区分哪个对象或对象组/线程获得特定信号。 为什么常规的对象不这样做?例如 而不是: final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); lock.lock(); try { while (count == items.length) notFull
条件
对象以及它们如何为每个对象提供多个等待集,以及如何区分哪个对象或对象组/线程获得特定信号。为什么常规的
对象不这样做?例如
而不是:
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();
我们是否仍然有多个等待集并区分通知的线程?在调用wait
或notify
时,您需要先同步
。当需要两个不同的集合时,需要两个对象进行同步。嵌套同步将给您带来死锁。这不好。您必须拥有对象的监视器才能使用其notFull.wait()
方法。即使它被允许,它仍然不会释放锁,因此没有其他线程可以访问它。在您的示例中,您在一个锁上创建了两个条件。这是内置同步所不能做到的——必须使用2个对象才能获得2个条件
您的第二个代码被破坏,因为您没有获得notFull和notEmpty上的锁,而是调用wait/notify-您将获得IllegalMonitorStateException。但是如果你试图同时锁定它们,你会发现你不能同时锁定它们。这就是区别但是使用条件I仍然需要条件
对象两个条件都可以,只要您只锁定一个锁定对象,而不是两个不同的锁定。这是监视器所不能做的。关于这个话题,这里有很多问答。请参阅和,了解eaxmple。这只是“保存”了多少个对象?不,这是为了避免由于必须在嵌套的同步块中获取两个不同的监视器而导致的死锁。@RalfH:嵌套的同步中的死锁
。“能举个例子吗?”吉姆说?