В моем простом коде ниже, если я заменим 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();
}
}