条件vs对象等待/通知

时间:2013-02-12 12:25:46

标签: java multithreading concurrency

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

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

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:1)

在致电synchronizewait时,您需要先notify。当您需要两个不同的集合时,需要两个对象才能同步。嵌套同步会给你死锁。

答案 2 :(得分:0)

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