IllegalMonitorStateException发生在线程未持有对象锁时调用wait/notify方法,正确做法是在synchronized块中调用并配合while循环检查条件,优先使用java.util.concurrent工具类简化并发控制。
在Java多线程编程中,IllegalMonitorStateException 是一个常见的运行时异常,通常发生在调用 wait()、notify() 或 notifyAll() 方法时线程未持有对象的监视器锁。理解其触发原因并掌握正确的处理方式,是编写稳定并发程序的关键。
这个异常的核心原因是:线程在没有获取目标对象的内置锁(即synchronized锁)的情况下,尝试调用该对象的 wait()、notify() 或 notifyAll() 方法。
例如以下代码会抛出异常:
new Thread(() -> {
Object.wait(); // 未持有锁,直接抛出IllegalMonitorStateException正确做法是确保这些方法必须在 synchronized 块或方法中被调用:
synchronized (someObject) {调用 wait/notify 系列方法前,必须通过 synchronized 获取对象锁。这是最基础也是最重要的预防措施。
即使正确持有锁,也应始终在 while 循环中调用 wait(),而不是 if 条件判断。
操作系统或JVM可能在没有 notify 的情况下唤醒线程(称为虚假唤醒),因此需要重新检查条件:
synchronized (lock) {这样可以确保只有在真正满足条件时才继续执行。
在现代Java开发中,建议使用 java.util.concurrent 包中的工具类来减少手动管理锁和条件的复杂性。
这些工具内部已正确处理了锁与等待逻辑,能有效避免 IllegalMonitorStateException 的发生。
基本上就这些。关键是理解 wait/notify 必须在 synchronized 上下文中执行,并尽量使用更高层次的并发结构来简化控制流程。不复杂但容易忽略细节。