Когда выйдет монитор в Java - PullRequest
2 голосов
/ 30 марта 2012

Если у меня есть код:

ReentrantLock lock = new ReentrantLock();
Condition waiting = lock.newCondition();

Тема 1:

    value = default;
    lock.lock();
    try {
        waiting.await(new Long(timeout).longValue(), TimeUnit.SECONDS);
    } catch (InterruptedException e) {

        } finally {
            lock.unlock();
        }

Тема 2:

  lock.lock();
  //set value
  waiting.signalAll();
  lock.unlock();    

Правильно ли я в том, что монитор при блокировке освобождается при вызове await, позволяя запускать управляемый событиями поток 2 при необходимости? Если поток 2 запустится, когда поток 1 сможет возобновить работу после signalAll () или lock.unlock ()? Если поток 2 сигнализирует о пробуждении, но все еще имеет блокировку, как это работает ??

1 Ответ

3 голосов
/ 30 марта 2012

Блокировка фактически снимается при вызове await. Когда вызывается signalAll, ожидающие потоки не просыпаются, пока сигнальный поток unlock s

Однако важно различать объектные мониторы Java с помощью Java Locks. Это отдельные конструкции, фактически ReentrantLock / Condition может быть монитором в другом контексте, чем тот, с которым вы работаете (например, если вместо await, который вы назвали wait, вы получите очевидное исключение IllegalMonitorStateException).

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