[英]IllegalMonitorStateException in code
class Test {
public static void main(String[] args) {
System.out.println("1.. ");
synchronized (args) {
System.out.println("2..");
try {
Thread.currentThread().wait();
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("3..");
}
}
}
我在此代碼中收到IllegalMonitorStateException
監視器異常。 據我了解,由於圍繞字符串數組對象args
的同步塊,當前線程必須已獲得該鎖,並且使用wait方法,我將釋放該鎖。
有人可以向我解釋此異常的原因嗎?
您正在Thread.currentThread()
上調用wait()
Thread.currentThread()
。 在任何對象上調用wait()
之前,您必須通過此對象上同步塊的同步方式擁有該對象的監視器。 所以缺少的是
synchronized(Thread.currentThread()) {
Thread.currentThread().wait();
}
也就是說,在Thread對象上調用wait()
並不是您應該做的事情,並且可能表明您不了解wait()
作用,尤其是考慮到您沒有其他任何調用notify()
或notifyAll()
。 在傳遞給main方法的參數上進行同步也是一個很奇怪的選擇。 wait()
是一種非常低級的方法,即使您完全了解它的作用,也應很少使用。 為了獲得更好的答案,您應該解釋一下您實際希望此代碼執行的操作。
嗨,我想我想您正在嘗試學習多線程的一些基本概念。 嘗試掌握一些好的在線教程: http : //www.javaworld.com/jw-04-1996/jw-04-threads.html
或嘗試一些基本的好書。 http://www.amazon.com/SCJP-Certified-Programmer-Java-310-065/dp/0071591060/
您編寫的程序實際上不需要同步,因為只有一個線程(主線程)。 我知道您只是在嘗試,因此提供了一些見解。 即使您在args(args.wait())上正確調用了wait方法或在Thread.currentThread上進行了同步,您的線程也可能進入不確定的等待狀態(使程序無響應),因為沒有其他線程可以通知您的主線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.