回答

4

當線程無法獲取信號量時(由於缺少許可證)會發生什麼情況。它會被轉移到等待狀態嗎?

是的。如果你在談論java.util.concurrent.Semaphore(和the aquire method這是發生了什麼:

獲取一個許可從這個信號,阻塞直到有一個可用,或者線程被中斷

[...]

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

  • 其他一些線程調用此信號量的release()方法,並且當前線程旁邊將被分配一個許可證;或

  • 某些其他線程會中斷當前線程。

tryAquire將然而,顧名思義,只能儘量將收購的鎖,而不是阻塞返回false,如果它沒有許可證。

當信號量變爲可用時,線程是否會恢復前一個執行順序?

是的。如果另一個線程調用release,則此線程可能會從acquire返回並繼續它的執行。

+0

因此它被移動到BLOCKED狀態,就像當線程無法獲得監視器鎖定時發生的情況。問題中的「等待狀態」可能不是正確的詞? – blitzkriegz 2010-10-21 09:16:43

相關問題