Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Java

สามารถเรียก wait() โดยไม่ได้ lock ก่อนหน้าใน Java ได้หรือไม่?


ไม่สามารถ เรา ไม่สามารถเรียก wait() โดยไม่ได้ lock ก่อนหน้า ใน Java หลังจากได้ lock แล้วจึงต้องเรียก wait() method (มี timeout หรือไม่มี) บนออบเจ็กต์นั้น หากพยายามเรียก wait() โดยไม่ได้ lock จะโยน 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() โดยไม่ได้ lock ก่อน ทำให้เกิด IllegalMonitorStateException ตอนรันไทม์ เพื่อแก้ไข ต้องได้ lock ก่อนเรียก wait() และประกาศ run() ว่า synchronized

ผลลัพธ์

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