Задать вопрос
  • Почему возникает deadlock?

    Vamp
    @Vamp
    У вас тут гонка, а не дедлок. Методы second и third не успевают встать в ожидание condition.

    Если визуализировать пошагово:
    1. first - захватил блокировку объекта lock
    2. second - захватить lock не может, так как он уже захвачен, поэтому встаёт в ожидание
    3. third - захватить lock не может, так как он уже захвачен, поэтому встаёт в ожидание
    4. first - пишет в консоль "first"
    5. first - сигналит condition1
    6. first - релизит lock
    7. second - просыпается и захватывает lock
    8. 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);
    }
    Ответ написан
    Комментировать