2012-10-03 47 views
1

如果一個不公平的信號量許可證不是即時可用的,tryAcquire(long timeout, TimeUnit unit)會阻止,直到許可證可用(即收益執行),或者它會旋轉,直到許可證可用?將Semaphore.tryAcquire(...)阻止或旋轉,直到許可證可用?

如果這個調用旋轉並且一個系統有一堆信號量,那麼系統是否會冒着大量自旋信號量的風險?

+2

Java文檔[tryAquire](http://docs.oracle.com/javase/1.5.0/docs/api/java/util/concurrent/Semaphore.html#tryAcquire%28int,%20long,%20java.util .concurrent.TimeUnit%29)是自解釋性的 –

+0

該死的,我必須讀錯了tryAquire JavaDoc ......但正如它解釋的,它不會旋轉,但會產生執行。 – Cowboy

回答

4

每的Javadoc:

如果沒有可用的許可,那麼當前線程用於線程調度目的,禁用並一直處於休眠狀態的三種情況之一發生:

  • 其他某些線程調用這個信號量的release()方法,並且當前線程接下來將被分配一個許可證;或
  • 某些其他線程中斷當前線程;或
  • 的指定的等待時間

這表明,作爲阻止線程被標記(穿上阻塞隊列爲灰色狀態),其允許處理器做其他工作。

+0

「線程」未被釋放。它只是進入阻塞隊列。你能重申最後一行嗎? – Gray

+0

它不會旋轉('while(!canExecute);')。這足以知道它將停留在某些不使用CPU的結構中。 – helios

相關問題