2011-03-15 26 views
2

我正在使用Java 6,並在實踐中閱讀了Java Concurrency。我試圖弄清楚在使用這些方法時,如果等待鎖的休眠線程在休眠時使用任何CPU週期。有人知道嗎?謝謝!ReentrantReadWriteLock類中的readLock()或writeLock()方法所做的休眠線程是否消耗CPU週期?

Matt

+0

你是指'readLock()'和'writeLock()'方法嗎?這些根本不會阻止。你是否在等待獲取鎖的時候詢問線程是否使用了CPU? – 2011-03-15 21:06:48

+0

對不起,是的,那些是我正在談論的方法。我正在查看代碼中的引用變量。 Java API指出:「如果鎖由另一個線程保存,則當前線程因爲線程調度目的而被禁用,並且處於休眠狀態,直到已獲取寫鎖,此時寫鎖保持計數設置爲1。所以我想我的問題是,「休眠」意味着沒有CPU週期?聽起來像是這樣,但我討厭假設線程所關心的任何事情。謝謝。 :) – 2011-03-15 21:14:03

回答

4

任何操作都會消耗時鐘週期。但是,當一個線程掛起時,時鐘週期的數量是固定的,並且不取決於掛起的時間。如果線程即使在相對較短的時間內被掛起,這也是很好的,但是在很短的時間內它不是非常高效,這就是爲什麼Lock不立即掛起線程,而是重試少量次以獲得鎖定之前暫停線程(在希望它可以避免這樣做)

我假設你說的是Lock.lock()ReentrantReadWriteLock.readLock()和ReentrantReadWriteLock.writeLock()支持。

+0

(修正了主題反映了正確的方法名稱。)是的,我想我的問題是,如果兩個線程都試圖獲得鎖定,那麼呈現休眠狀態(根據API)是否消耗任何cpu週期? – 2011-03-15 21:22:04

+0

停止和啓動一個線程相對昂貴,但是這個代價並不是正在進行,一旦處於休眠狀態,線程不會消耗週期。相對昂貴的平均值約爲10-20微秒。這可能聽起來不多,但可能是5萬個時鐘週期。 – 2011-03-15 21:27:17

+1

彼得,非常感謝。這說明了一件很重要的事情。 – 2011-03-15 21:39:51

相關問題