Код выполняется с ReentrantLock.signalAll (), но не с ReentrantLock.signal (). Почему? - PullRequest
0 голосов
/ 12 октября 2019

В моем простом коде ниже, если я заменим condition1.signal() / condition2.signal на condition2.signalAll() / condition2.signalAll(), код никогда не завершится. Сначала он зависнет ().

Я знаю, что signalAll() пробуждает все ожидающие потоки вместо одного, но в моем случае у меня есть только один поток, ожидающий каждую блокировку.

Мой вопрос: почему изменение его на signalAll() сделает код выполненным успешно?

class Foo {
  ReentrantLock lock1 = new ReentrantLock();
  Condition condition1 = lock1.newCondition();

  ReentrantLock lock2 = new ReentrantLock();
  Condition condition2 = lock2.newCondition();

  public void first(Runnable printFirst) throws InterruptedException {
    lock1.lock();
    printFirst.run();
    condition1.signalAll();
    lock1.unlock();
  }

  public void second(Runnable printSecond) throws InterruptedException {
    lock1.lock();
    condition1.await();
    lock1.unlock();
    lock2.lock();
    printSecond.run();
    condition2.signalAll();
    lock2.unlock();
  }

  public void third(Runnable printThird) throws InterruptedException {
    lock2.lock();
    condition2.await();
    lock2.unlock();
    printThird.run();
  }
}
...