Я хотел бы понять, что на самом деле происходит, когда мы выполняем следующий фрагмент кода.
Когда поток выполняет someMethod() и попадает в цикл while, что произойдет, если он снова и снова будет вызывать метод await? Как контекст потока хранится/поддерживается блокировкой Condition/ReentrantLock?
Кроме того, когда поток вызывает await(), это означает, что он освобождает текущую блокировку и переходит в состояние ожидания. Означает ли это, что другой поток может получить блокировку? Если да, то какой смысл писать цикл while вокруг метода await()?
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
...
...
public void someMethod() {
lock.lock();
try {
for (int i = 2; i < n; i = i + 2) {
while (state != 2) {
condition.await();
}
printNumber.accept(i);
r.run();
state = 0;
condition.signalAll();
}
} finally {
lock.unlock();
}
}
Пожалуйста, поправьте меня, если я неправильно понимаю. Заранее спасибо.