В моей программе я использую объект Condition, созданный изПараллелизм: Condition.awaitNanos() не отпуская замок
private static final Lock lock = new ReentrantLock();
как так:
private static final Condition operationFinished = MyClass.lock.newCondition();
Иногда (как это всегда происходит с проблемы параллелизма) я сталкиваюсь следующее поведение:
- Резьба1 aquires замок
- Thread1 вызывает
operationFinished.awaitNanos()
- это должно приостановить Thread1 и отпустить блокировку. - Thread2 пытается получить тот же замок, но вывод отладки показывает, что Thread1 по-прежнему удерживает блокировку!
В соответствии с документацией это поведение невозможно, поскольку на awaitNanos()
Thread1 сначала выпускает замок, а затем приостанавливает работу. Если он не отпустил блокировку, то он не будет приостановлен, поэтому Thread2 никогда не сможет получить возможность попытаться зацепиться за блокировку.
Неужели кто-то испытал нечто подобное? Эти ошибки случаются один раз в 100 раз, но все же это указывает на то, что я либо неправильно использую утилиты параллелизма, либо что есть какая-то ошибка в пакете java.utils.concurrent. * (Что я сомневаюсь) ,
UPDATE:
В ответ на Peters ответ:
я наблюдаю следующее поведение: Очевидно, 2 нити ТУПИК друг друга. Я вижу, что блоки Thread2 (ожидающие блокировки) и в то же время awaitNanos()
в Thread1 никогда не выходят из строя.
Thx для вашего ответа! Обновлен мой ответ с дополнительной информацией: блокировка определенно по-прежнему поддерживается Thread1, так как я вижу блокировку Thread2 на 'lock()'. – quaylar
И Thread1 окончательно находится в ожиданииNanos()? Можете ли вы показать нам трассировку стека для этих двух потоков и любого другого потока, который может удерживать блокировку. например из 'jstack' –
Я понял, что возможно, что Thread2 попытается захватить блокировку, когда Thread1 все еще не ждетNanos().Но даже в этом случае Thread2 блокируется до тех пор, пока Thread1 не вызовет waitNanos(), а затем захватит блокировку ... – quaylar