簡體   English   中英

信號量虛假喚醒

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM