[英]Java Thread Synchronized object for wait and notify
當我們在線程環境中使用等待和通知時。 我有一個類來處理數據作為后台進程。 當沒有數據要處理時,它應該調用等待。
synchronized(some_object){
wait();
}
在另一堂課中,我再次添加數據。 我需要調用notify()
方法。
synchronized(some_object){
runnabale_object.notify();
}
為什么我應該在這兩個不同的類中為同步塊使用相同的對象。 當我閱讀同步用於
“同步”關鍵字可防止多個線程同時訪問代碼塊或對象。
但這兩個是不同的塊。 但是當我們使用多線程時,我可以理解這個問題。 一個線程阻塞另一個線程可以在同一個線程調用notify之前調用notify。
我的問題
我們可以在單線程環境中使用不同的鎖對象(同步(對象))嗎?
在單線程環境中,您不需要鎖。 你可以使用任何你想要的東西,也可以什么都不用。
在單線程環境中,您可以保證沒有線程在等待(),因此通知()不會做任何事情。
當我們在不同的類中等待和通知時使用相同鎖對象的最佳方式?
當您通知()時,您必須執行狀態更改。 當您在循環中 wait() 時,您會檢查該狀態更改。 如果你不這樣做,你可能會遇到兩個問題。
當沒有要處理的數據時,它應該調用等待。
不是 when ,而是while 。
等待和通知是低級原始操作,旨在以非常特定的方式使用。
在消費者線程中:
synchronized(lock) {
while (thereIsNothingToProcess()) {
lock.wait();
}
processSomething();
}
在生產者線程中:
synchronized(lock) {
makeSomethingAvailableToProcess();
lock.notifyAll(); //or lock.notify() if you think you can get away with it.
}
如果你遵循這個確切的模式,那么:
我有同樣的問題,所以我查了一下。 兩個同步塊可以在同一個對象中使用的原因是'wait()'實際上會釋放監視器,以便其他線程可以獲得同一個對象的守護者。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.