在多线程编程中,使用 wait() 方法来暂停当前线程的执行,直到收到其他线程的通知。然而,如果你在释放锁之前修改了锁对象,就会遇到 illegalmonitorstateexception 错误。
考虑以下代码:
// 线程打印完毕后,设置下一个要打印的线程标识,并唤醒其他线程 if (current_thread.equals("a")) { current_thread = "b"; } else if (current_thread.equals("b")) { current_thread = "c"; } else if (current_thread.equals("c")) { current_thread = "a"; }
在这个代码段中,使用了一个 volatile修饰的字符串 current_thread 作为锁对象。但在线程释放锁之前,却修改了锁的引用。这样会导致以下错误:
java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at java.lang.Object.wait(Object.java:502) at 并发编程.work2.Test$PrintThreadName.run(Test.java:42)
要解决此错误,可以使用另一个锁对象实现同步,在释放锁之前不要修改锁对象。