Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> Java

Có thể gọi wait() mà không có khóa (lock) trong Java không?

Không, chúng ta không thể gọi phương thức wait() mà không có khóa. Trong Java, sau khi đã có khóa thì mới gọi wait() (có timeout hoặc không) trên đối tượng đó. Nếu cố gọi wait() không có khóa, sẽ ném ra java.lang.IllegalMonitorStateException.

Ví dụ

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(); 
    } 
}

Trong ví dụ trên, gọi wait() không có khóa gây ra IllegalMonitorStateException tại runtime. Để sửa, cần có khóa trước khi gọi wait() và khai báo run() là synchronized.

Kết quả

Exception in thread "Thread-0" java.lang.IllegalMonitorStateException at java.lang.Object.wait(Native Method) at ThreadStateTest.run(ThreadStateTest.java:4)