Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java.util.concurrent.locks.Condition接口文档_Java_Multithreading_Locking - Fatal编程技术网

Java.util.concurrent.locks.Condition接口文档

Java.util.concurrent.locks.Condition接口文档,java,multithreading,locking,Java,Multithreading,Locking,在条件接口的文档中: 有一个示例类使用该条件。我将在此处复制/粘贴: class BoundedBuffer { final Lock lock = new ReentrantLock(); final Condition notFull = lock.newCondition(); final Condition notEmpty = lock.newCondition(); final Object[] items = new Object[100];

在条件接口的文档中:

有一个示例类使用该条件。我将在此处复制/粘贴:

class BoundedBuffer {
   final Lock lock = new ReentrantLock();
   final Condition notFull  = lock.newCondition(); 
   final Condition notEmpty = lock.newCondition(); 

   final Object[] items = new Object[100];
   int putptr, takeptr, count;

   public void put(Object x) throws InterruptedException {
     lock.lock();
     try {
       while (count == items.length)
         notFull.await();
       items[putptr] = x;
       if (++putptr == items.length) putptr = 0;
       ++count;
       notEmpty.signal();
     } finally {
       lock.unlock();
     }
   }

   public Object take() throws InterruptedException {
     lock.lock();
     try {
       while (count == 0)
         notEmpty.await();
       Object x = items[takeptr];
       if (++takeptr == items.length) takeptr = 0;
       --count;
       notFull.signal();
       return x;
     } finally {
       lock.unlock();
     }
   }
 }
我不明白的是,这怎么可能在不造成死锁的情况下工作(注意:我没有测试它,我只是假设它工作)

如果我调用BoundedBuffer.put一百次,那么在第一百次调用时,它将在notFull.await()方法中被阻塞,这将被锁定。 如果我从另一个线程执行BoundedBuffer.take(),那么我应该在lock.lock()中的第一行被阻止


我错过了什么吗?

是的,你确实错过了什么。从:

等待条件提供的关键属性是,它以原子方式释放关联的锁并挂起当前线程,就像Object.wait一样

因此,当调用
await()
时,锁被释放

await()
方法本身的JavaDoc:

void await()抛出InterruptedException

使当前线程等待,直到发出信号或中断。与此条件相关联的锁将自动释放,当前线程出于线程调度目的被禁用,并处于休眠状态,直到发生以下四种情况之一:

方法
signal()
唤醒一个线程,该线程将在继续之前重新获取锁。从方法的JavaDoc
signal()

无效信号()

唤醒一个正在等待的线程。如果有任何线程在此条件下等待,则会选择一个线程进行唤醒。然后,该线程必须在从等待返回之前重新获取锁


非常感谢。我错过了那部分。