2011-12-25 244 views
5

正如問題所在。我在Windows 7上使用JDK 6.0,並試圖使用信號作爲解決同步問題的機制。它完美地工作,但我試圖避免忙於等待我的問題。Java信號量默認使用忙等待還是等待/通知?

我只想問Java文檔和割捨這麼麻煩,但該文檔是這樣的:

Acquires the given number of permits from this semaphore, 
blocking until all are available, or the thread is interrupted. 

Acquires the given number of permits, if they are available, 
and returns immediately, reducing the number of available permits 
by the given amount. 

If insufficient permits are available then the current thread 
becomes disabled for thread scheduling purposes and lies dormant 

http://docs.oracle.com/javase/6/docs/api/java/util/concurrent/Semaphore.html#acquire(int

也就是說,該文檔似乎在暗示兩個答案。哪一個是正確的?

+0

大部分'java.util.concurrent'原語都依賴於基於park/unpark的'java.util.concurrent.locks.AbstractQueuedSynchronizer',即沒有繁忙的旋轉 – bestsss 2011-12-26 03:20:07

回答

0

這顯然等待/通知,由於這一行:

如果足夠的可用許可,那麼當前線程用於線程調度目的,禁用 和處於休眠狀態。

這意味着線程不會被OS調度,直到喚醒它的事件(可用信號許可)纔會發生,此時線程將被髮送信號以繼續執行。

+0

它是公園/非公園,不等待/通知,因爲等待/通知需要同步(或爭用),公園/非公園 - 之間存在差異。 – bestsss 2011-12-26 03:21:45

1

我不明白它是如何暗示忙等待。它清楚地表明該線程被「禁用」並處於休眠狀態。基本上,它很便宜:線程在等待獲取信號量時不會消耗處理器時間。

+0

但是上面的那一行說,在等待時線程阻塞,這似乎是矛盾的。 – Faqa 2011-12-25 18:36:20

+1

是的。阻塞<>忙等待。如果一個線程在信號量中沒有足夠的'許可'調用'等待',那麼這個調用不會返回,直到另一個線程發出足夠的許可來滿足等待線程。正如Jon Skeet所寫的那樣 - 在等待期間線程被阻塞,並且根本沒有CPU。試試看看 - 在空信號量上阻塞循環線程並檢查CPU使用情況 - 它將爲零。 – 2011-12-25 19:00:07

+0

@Faqa:正如馬丁所說,阻塞和忙等待不一樣。 – 2011-12-25 20:34:44