[英]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.