[英]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
}
我面臨的問題似乎很簡單,但我很難看到如何捕獲所有邊緣情況。
一種解決方案可能是使用帶有Condition
的Lock
,然后await
在waitOnCondition
上的所有線程將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.