3

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

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

4

3 回答 3

3

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

你的第二个代码被破坏了,因为你没有锁定 notFull 和 notEmpty 而是调用 wait / notify - 你会得到 IllegalMonitorStateException。但是,如果您尝试将它们都锁定,您会发现您无法同时执行此操作。这就是区别

于 2013-02-12T12:40:21.690 回答
1

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

于 2013-02-12T12:33:43.813 回答
0

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

于 2013-02-12T12:34:28.500 回答