Ожидание состояния в реентерабельном замке

Следующий код взят изJavaDoc изCondition:

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();
    }
  } 
}

Представь себе 2 темы,Consumer а такжеProducerодин использующийtake, одинput на одном экземпляреBoundedBuffer.

Скажем такConsumer идет первым, бежитtake() в котором он запираетlock и теперь зацикливается наnotEmpty.await();.

Как теперь можноProducer возможно попасть вput() метод прошлого блокированияlock, который уже проводитсяConsumer?

Что мне здесь не хватает? Этоlock & quot; временно освобожден & quot; пока нить ждет одного из своих условий? И чтоreentrancy о замке имею ввиду, точно?

Ответы на вопрос(3)

Ваш ответ на вопрос