Понимание отказа от блокировки в ожидании () - PullRequest
0 голосов
/ 06 сентября 2018

Из Java Условие Документы

class BoundedBuffer<E> {
   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(E 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 E take() throws InterruptedException {
     lock.lock();
     try {
       while (count == 0)
         notEmpty.await();
       E x = (E) items[takeptr];
       if (++takeptr == items.length) takeptr = 0;
       --count;
       notFull.signal();
       return x;
     } finally {
       lock.unlock();
     }
   }
 }

Предположим, что поток Produce вызывает put, поэтому Produce теперь владеет блокировкой lock. Но условие while верно, поэтому Produce делает notFull.await(). Мой вопрос сейчас, если поток Consume вызывает take, в строке, которая говорит lock.lock(), что именно происходит?

Я немного растерялся, потому что мы позволили старому lock войти в критическую секцию, и теперь нам нужно получить его из другого потока.

1 Ответ

0 голосов
/ 08 сентября 2018

Если вы посмотрите ближе на Javadoc для Condition.await () , вы увидите, что метод await () атомарно снимает блокировку и приостанавливает себя:

"Блокировка, связанная с этим условием, снимается атомарно, а текущий поток отключается для целей планирования потока и остается неактивным, пока не произойдет одно из четырех ..."

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...