добрый день! нужна помощь, чтобы разобраться в причинах возникновения 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).