2011-01-27 46 views
0

像在wait()方法中一樣,如果調用對象(對於wait())沒有被授予鎖定,就像通過調用對象上的sychronizing一樣,它會引發IllegalMonitorStateException。以編程方式檢查鎖是否被授予?

我想知道

像wait()方法,才能確保鎖被授予,通過編寫一些代碼? 還是僅由JVM完成?

回答

4

只要寫:

synchronized (thing) { 
    thing.wait(); 
} 

如果它不是已經鎖定,這將被鎖定,如果它已被鎖定,那麼它的罰款。

+0

這是一個很糟糕的問題:) – bestsss 2011-01-27 10:03:39

0

我不知道Java,但通常的鎖語義是當你試圖獲得一個鎖時,你會阻塞,直到你得到它。這意味着不需要驗證您是否真的獲得了鎖定 - 當流程到達下一行時,您可以確定您已鎖定。當你開始試圖用鎖來做其他事情時,比如試圖檢查它是否被鎖定,你通常做錯了。

+0

只是我想知道我們如何檢查? – ajduke 2011-01-27 09:40:38

3

你可以撥打Thread.holdsLock()找出是否鎖定。然而,你應該設計你的代碼,以便你知道你是否有鎖。你應該能夠靜態確定它。

通知/等待在Java 5之前是有用的。如果您擁有Java 5或更高版本,則使用併發庫可能是更好的選擇。

編輯:我指的是2004年增加的併發包http://download.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.htmlhttp://download.oracle.com/javase/tutorial/essential/concurrency/highlevel.html然後它是一個外部併發庫。 http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html

+0

好的..是concurrncy庫是Thread類還是別的?你可以請精巧嗎? – ajduke 2011-01-27 09:46:46

相關問題