[英]Can Semaphore.acquire() throw InterruptedException due to a spurious wakeup?
[英]Spurious wakeup with Semaphore
我有一個疑問:假設我有一個名為sem
Semaphore類對象,並且一個線程嘗試通過sem.acquire()
獲得許可,而沒有,則該線程被掛起。 現在,如果線程被虛假喚醒喚醒,會發生什么? 我應該在某種循環中插入sem.acquire()
嗎?
只有非常基本的Object.wait()
方法才會受到虛假喚醒(實際上只有Unsafe.park()方法,但是如果沒有黑客手段,則無法訪問它),所有更復雜的工具都會在內部進行處理。
如果查看Semaphore.acquireUninterruptibly()
的實際代碼,則會發現以下構造(隱藏在AbstractQueuedSynchronizer.doAcquireShared()
):
for (;;) {
// ... try aquire, else:
if (shouldParkAfterFailedAcquire(p, node) &&
parkAndCheckInterrupt())
interrupted = true;
}
for(;;)
循環基本上是一個while(true)
循環,因此即使parkAndCheckInterrupt()
可能會虛假地喚醒,該循環也將確保這只會導致另一個tryAquire運行失敗,然后將其重新休眠。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.