В моей программе я использую объект Condition, созданный из
private static final Lock lock = new ReentrantLock();
примерно так:
private static final Condition operationFinished = MyClass.lock.newCondition();
Иногда (как это всегда происходит с проблемами параллелизма) я сталкиваюсь со следующимиповедение:
- Thread1 получает блокировку
- Thread1 вызывает
operationFinished.awaitNanos()
- это должно приостановить Thread1 и снять блокировку. - Thread2 пытается получить такую же блокировку,но отладочный вывод показывает, что Thread1 все еще удерживает блокировку!
Согласно документации это поведение невозможно, поскольку при awaitNanos()
Thread1 сначала снимает блокировку, а затем приостанавливает работу.Если он не снимает блокировку, он не приостанавливается, поэтому Thread2 никогда не сможет даже попытаться захватить блокировку.
Кто-нибудь испытывал нечто подобное?Эта ошибка случается один раз в 100 раз - но все же это указывает на то, что я либо не использую утилиты параллелизма надлежащим образом, либо что в пакете java.utils.concurrent. * Есть какая-то ошибка (в чем я сомневаюсь).
ОБНОВЛЕНИЕ:
В ответ на ответ Петерса:
Я наблюдаю следующее поведение: Очевидно, 2 потока взаимоблокируют друг друга.Я вижу, что блоки Thread2 (ожидающие блокировки) и в то же время awaitNanos()
в Thread1 никогда не прерываются.