Что ж, пока ваш поток ожидает уведомления, он все еще удерживает другие блокировки, значительно увеличивая вероятность тупиковой ситуации.
Похоже, ваш код владеет тремя объектными мониторами:
- объект, которому принадлежит methodOne, потому что он синхронизируется
- lockObj, потому что вы синхронизируете его
- parameterAttributes, потому что вы вызываете wait для него
Делаетваш код бросить исключение IllegalMonitorStateException?Я спрашиваю, потому что в примере кода не очевидно, что он на самом деле владеет монитором parameterAttributes (в примере кода нет синхронизированных (parameterAttributes)).
В любом случае, я думаю, вам нужно упростить.Владение таким количеством мониторов кажется слишком сложным.Обычно вам нужны только стратегии, синхронизированные методы или lockObj, который защищает некоторые изменяемые состояния, а не оба.Кроме того, я бы посоветовал изучить рамки актера, такие как Акка.