簡體   English   中英

此代碼可以引發IllegalMonitorStateException

[英]This Code can Throw an IllegalMonitorStateException

void waitForSignal(){
    Object ob =new Object();

    synchronized (Thred.currentThread()) {
        try {
            ob.wait();
            ob.notify();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}

此方法引發IllegalMonitorStateException。 有人可以解釋為什么。

提前致謝

您應該僅對已獲得鎖定的對象調用wait

在您的代碼中,您已經獲得Thread.currentThread()鎖定,但是您正在ob上調用它,這將引發IllegalMonitorStateException

因此,您應該將同步塊更改為:-

synchronized (ob) {

}

您要在等待的對象上進行同步:

synchronized (ob) {
        try {
            ob.wait();
            ob.notify();
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

如果您甚至通過IllegalMonitorException解決了問題,例如

void waitForSignal() {
    Object ob = new Object();
    synchronized (ob) {

您的代碼將無法正常工作。 在您的代碼中,每個線程都會創建一個新的鎖,該鎖在方法外部是不可見的。 其他線程沒有機會通知正在等待的線程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM