Сегодня мы сталкиваемся с чрезвычайно неожиданным исключением. Внутри синхронизированного блока мы вызываем wait(), и он бросает IllegalMonitorStateException
. Что может вызвать это?
Это происходит в хорошо проверенном исходном коде: http://svn.apache.org/viewvc/river/jtsk/trunk/src/com/sun/jini/jeri/internal/mux/Mux.java?view=markup#l222
Мы устранили очевидные причины:
- мы синхронизированы по правой переменной? Да, это
muxLock
- Это изменчивая переменная? Нет,
muxLock
является окончательным. - Мы используем любые странные "-XX:" флаги JVM, которые могут повлиять на поведение монитора? Нет, но мы запускаем JVM, встроенный в приложение С++ через JNI.
- Это странная JVM? Нет, это Sun 1.6.0_25 win/x64 JRE
- Это известная ошибка JVM? Невозможно найти что-либо релевантное в http://bugs.sun.com/bugdatabase
Итак, я пытаюсь думать о более надуманных объяснениях.
- может произойти ошибка неконтролируемой памяти, вызывающая зависание состояния монитора? Мы смотрим на это, но мы еще не видим признаков ошибок памяти.
ОБНОВЛЕНИЕ: (на основе комментария)
Я также проверил из stacktrace и breakpoint, что поток действительно находится внутри синхронизированного блока, когда генерируется исключение. Это не тот случай, когда какой-либо другой несвязанный код испускает исключение (если только что-то НЕ ДЕЙСТВИТЕЛЬНО запутывает Eclipse!)