什么会导致非法监控状态从同步块内部出现?
我们今天遇到了一个非常令人惊讶的例外。在同步块内部,我们调用 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 标志?不,但是我们正在通过JNI启动嵌入在C++应用程序中的JVM。
- 这是一个奇怪的JVM吗?不,这是太阳的1.6.0_25赢/x64 JRE
- 这是一个已知的JVM错误吗?在 http://bugs.sun.com/bugdatabase 找不到任何相关内容
所以,我试图想出更牵强的解释。
- 未捕获的内存不足错误是否会导致显示器状态搞砸?我们正在研究这个问题,但我们还没有看到内存错误的证据。
更新:(基于评论)
我还从堆栈跟踪和断点验证了当引发异常时,线程确实在同步块内。这并不是说其他一些不相关的代码会发出异常(除非有些东西真的令人困惑的Eclipse!