簡體   English   中英

Java並發 - 離開方法后重置條件

[英]Java concurrency - reset condition after leaving method

我試圖找出以下問題的解決方案:

public void signal(){
   //resets condition and signals threads blocked below
}

public void getValue(){

    waitOnCondition(); //block if a condition is not met. When signalled, all threads should proceed and get the value

    //get value

    resetCondition(); //reset condition, so that the next thread that executes this method blocks on the method above

}

我面臨的問題似乎很簡單,但我很難看到如何捕獲所有邊緣情況。

一種解決方案可能是使用帶有ConditionLock ,然后awaitwaitOnCondition上的所有線程將await直到標志設置為true然后繼續,例如。 執行signal()的線程然后將使用相同的鎖,將標志設置為true並signal 然后,釋放的線程將重新獲取鎖以將條件設​​置為false。 但是,這並不能保證所有線程都將到達getValue點。 例如:

線程1和2正在等待,獲得信號。 在發出信號后,線程1重新獲取鎖定,檢查條件,現在為真,然后繼續。 獲取值,獲取鎖並將條件設置為false。 線程2現在看到條件仍為false,並再次阻塞。

另一個非常整潔和優雅的解決方案是使用CountDownLatch 這保證了所有線程都將繼續。 但是,這不可重置。 還有其他想法或意見嗎?

看起來像CyclicBarrier就是你所需要的。 它是可重置的,並且當所有各方都在那里時也允許觸發屏障動作。

Phaser也是CyclicBarrier的高級版本,它需要運行JDK 7。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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