2013-06-11 66 views
0

考慮的碼本部分之前:通知()/ notifyAll的()中的所有離開同步塊

synchronized(object) { 

    .... 

    object.notify(); // or object.notifyAll(); 

    // do something else 
    doSomethingElse(); 

} 

不要Java語言規範或API評論或一些其它文檔澄清在這種情況下,預期的行爲?

是否會立即通知其他線程,或僅在執行離開同步塊時通知其他線程?

+0

看到我的答案在這裏:http://stackoverflow.com/a/11544976/179850 – Gray

+0

你是對的,這是一個重複。 –

+0

我會關閉它。有時候發現你的問題是重複的很難。 –

回答

1

線程將立即得到通知,但它們只有在獲得對顯示器的控制權之後纔會執行,而這隻有在當前正在執行的線程通過離開​​塊而放棄對顯示器的控制之後纔會執行。

這是一個例外,如果當前有權訪問監視器的線程通過調用wait()來獲得控制權。在這種情況下,監視器上等待的任何其他線程(包括被notify()notifyAll()調用喚醒的線程)都可能獲得對監視器的控制權並使原始線程處於等待狀態。

+0

因此,從技術上講,這意味着要執行這兩個條件 - 應該通知他們,並且應該釋放實際的鎖定。 –

+0

瑣事點:鎖可以在'doSomethingElse'內用'wait'釋放,其他線程喚醒並可能在'synchronized'塊退出之前獲得鎖。 –

+0

啊,這是一個公平點。我會編輯。 –