добрый день! нужна помощь, чтобы разобраться в причинах возникновения deadlock, при решении популярной задачи.
public class SomeClass {
private final ReentrantLock lock = new ReentrantLock();
private final Condition condition1 = lock.newCondition();
private final Condition condition2 = lock.newCondition();
public void first() {
lock.lock();
try {
System.out.println("first");
} finally {
condition1.signal();
lock.unlock();
}
}
public void second() {
lock.lock();
try {
condition1.await();
System.out.println("second");
condition2.signal();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
public void third() {
lock.lock();
try {
condition2.await();
System.out.println("third");
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
lock.unlock();
}
}
}
если я правильно понимаю, поток захватывает лок, доходит до условия (condition.await) и отпускает лок, позволяя другому потоку захватить лок и, либо выполнить вывод в консоль и просигналить об этом (condition.signal), либо остановится на условии и отпустить лок.
ЗЫ. суть задачи - гарантированно получить упорядоченный вывод (first, second, third).