wait方法为什么要写在Synchronized代码块中?

69 阅读1分钟

一、测试代码:

@Test
public void testObjectWait() {
    Object obj = new Object();
    try {
        obj.wait();
    } catch (InterruptedException e) {
        throw new RuntimeException(e);
    }
}

// 执行结果:
//java.lang.IllegalMonitorStateException
//	at java.base/java.lang.Object.wait(Native Method)
//	at java.base/java.lang.Object.wait(Object.java:328)

二、原因

wait方法是Object.class中的一个方法,执行wait()时,对线程状态而言,线程会释放对当前Object的锁(线程状态的锁只有Synchronized),由于测试代码中的没有对Object使用Synchronized,所以当前线程不会获取Object的锁,没有锁当前也就没有释放对象锁一说,所以抛出非法监视器状态异常,每个对象都有Monitor,监控对象的状态。