簡體   English   中英

用於等待和通知的 Java 線程同步對象

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

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