1
我非常熟悉wait()/notify()
信令方案在Java中的工作原理。但是,我意識到我看到的一些使用模式是Producer/Consumer方案的變體,或者Barrier的實現。我也看到了一些衆所周知的併發問題的實現,例如Dining Philosophers使用wait/notify,但顯然是用於教學目的。併發Java程序中的等待通知的非標準用法
此外,所有方案隨後的總是一個循環中調用wait()
乖建議,和只透過循環,如下面的代碼後改變某些共享變量:
synchronized(mon) {
// #CP1 - Do not change variables here
while !(mycondition) {
try{
// #CP2 Do not change variables here
mon.wait();
} catch(catch (InterruptedException e) { e.printStackTrace(); }
}
// Condition satisfied - Now you can change!
makeOperation();
// Tell others that you're done and exit
mon.notifyAll();
}
我的問題是:爲還有其他使用wait()/notify()
信號的模式比我引用的模式還要多嗎?你有沒有以非正統的方式使用它?爲什麼?這裏有一些更具體的問題可以幫助您:
- 您有沒有看過在退出循環之前改變共享變量的實現?在我的例子中,是否有理由在控制點
#CP1
和#CP2
中分配一些東西? - 是否有某些情況下您選擇使用
notify()
而不是notifyAll()
?儘管可能的性能增益,但你對此的確信不會導致一些死鎖?爲什麼? - 有一些複雜的情況,其中等待條件
mycondition
依賴於多個線程,例如mycondition= a_ready && b_ready && c_ready
?
我認爲在現代,使用'wait'和'notify' **是控制線程的非標準方式。可以認爲沒有什麼可以用它們完成,而不能用'java.util.concurrent'工具完成,也沒有邊緣效應。 – OldCurmudgeon
@OldCurmudgeon:我同意自'java.util.concurrent'後'wait'和'notify'是非標準的。但有沒有人使用'java.util.concurrent.locks.Condition',這是'wait/notify'的高級替代品?如果是這樣,問題仍然存在。 – Pcgomes
我認爲限制自己到'條件'是無效的。生產者/消費者架構現在可以通過各種處理一對多,多對一和一對一數據流的「BlockingQueue」類完美實現。除此之外,你可以進入'CyclicBarrier',atomics甚至'ForkJoinPool'來實現任何事情。您還可以獲得其他各種好吃的東西,例如'Futures'和'ThreadPool'。試圖比較舊的'wait/notify'和'j.u.concurrent'的豐富程度,比較粉筆和奶酪。 – OldCurmudgeon