像在wait()方法中一樣,如果調用對象(對於wait())沒有被授予鎖定,就像通過調用對象上的sychronizing一樣,它會引發IllegalMonitorStateException。以編程方式檢查鎖是否被授予?
我想知道
像wait()方法,才能確保鎖被授予,通過編寫一些代碼? 還是僅由JVM完成?
像在wait()方法中一樣,如果調用對象(對於wait())沒有被授予鎖定,就像通過調用對象上的sychronizing一樣,它會引發IllegalMonitorStateException。以編程方式檢查鎖是否被授予?
我想知道
像wait()方法,才能確保鎖被授予,通過編寫一些代碼? 還是僅由JVM完成?
只要寫:
synchronized (thing) {
thing.wait();
}
如果它不是已經鎖定,這將被鎖定,如果它已被鎖定,那麼它的罰款。
我不知道Java,但通常的鎖語義是當你試圖獲得一個鎖時,你會阻塞,直到你得到它。這意味着不需要驗證您是否真的獲得了鎖定 - 當流程到達下一行時,您可以確定您已鎖定。當你開始試圖用鎖來做其他事情時,比如試圖檢查它是否被鎖定,你通常做錯了。
只是我想知道我們如何檢查? – ajduke 2011-01-27 09:40:38
你可以撥打Thread.holdsLock()找出是否鎖定。然而,你應該設計你的代碼,以便你知道你是否有鎖。你應該能夠靜態確定它。
通知/等待在Java 5之前是有用的。如果您擁有Java 5或更高版本,則使用併發庫可能是更好的選擇。
編輯:我指的是2004年增加的併發包http://download.oracle.com/javase/6/docs/api/java/util/concurrent/package-summary.html,http://download.oracle.com/javase/tutorial/essential/concurrency/highlevel.html然後它是一個外部併發庫。 http://gee.cs.oswego.edu/dl/classes/EDU/oswego/cs/dl/util/concurrent/intro.html
好的..是concurrncy庫是Thread類還是別的?你可以請精巧嗎? – ajduke 2011-01-27 09:46:46
這是一個很糟糕的問題:) – bestsss 2011-01-27 10:03:39