У вас тут гонка, а не дедлок. Методы
second
и
third
не успевают встать в ожидание condition.
Если визуализировать пошагово:
- first - захватил блокировку объекта lock
- second - захватить lock не может, так как он уже захвачен, поэтому встаёт в ожидание
- third - захватить lock не может, так как он уже захвачен, поэтому встаёт в ожидание
- first - пишет в консоль "first"
- first - сигналит condition1
- first - релизит lock
- second - просыпается и захватывает lock
- second - встаёт в ожидание condition1, которое будет бесконечным, потому что condition1 за всё время триггерится однократно и этот триггер уже отработал на 5 шаге
Ваш код сможет успешно завершиться если подобрать нужный тайминг. Например, так:
var c = new SomeClass();
try (var t = Executors.newFixedThreadPool(3)) {
t.submit(c::second);
t.submit(c::third);
Thread.sleep(100);
t.submit(c::first);
}