我們能不對Java中的鎖進行獲取就呼叫wait()方法嗎?
不能,我們不能在未獲取鎖的情況下呼叫 wait() 方法。Java 中,必須先獲取鎖,然後才能呼叫該物件上的 wait() 方法(帶超時時間或無超時時間)。如果我們嘗試在未獲取鎖的情況下呼叫 wait() 方法,可能會出現 java.lang.IllegalMonitorStateException。
示例
public class ThreadStateTest extends Thread { public void run() { try { wait(1000); } catch(InterruptedException ie) { ie.printStackTrace(); } } public static void main(String[] s) { ThreadStateTest test = new ThreadStateTest(); test.start(); } }
在上述示例中,我們需要在未獲取鎖的情況下呼叫 wait() 方法,因此會在執行時生成 IllegalMonitorStateException。為解決此問題,我們需在呼叫 wait() 方法之前獲取鎖並宣告 run() 方法已同步。
輸出
Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.base/java.lang.Object.wait(Native Method) at ThreadStateTest.run(ThreadStateTest.java:4)
廣告