1. 程式人生 > >java執行緒通訊

java執行緒通訊

一個執行緒如果沒有持有物件鎖,將不能呼叫wait(),notify()或者notifyAll()。否則,會丟擲IllegalMonitorStateException異常。 (校注:JVM是這麼實現的,當你呼叫wait時候它首先要檢查下當前執行緒是否是鎖的擁有者,不是則丟擲IllegalMonitorStateExcept,參考JVM原始碼的 1422行。)

一旦一個執行緒被喚醒,不能立刻就退出wait()的方法呼叫,直到呼叫notify()的執行緒退出了它自己的同步塊。換句話說:被喚醒的執行緒必須重新獲得監視器物件的鎖,才可以退出wait()的方法呼叫,因為wait方法呼叫執行在同步塊裡面。如果多個執行緒被notifyAll()喚醒,那麼在同一時刻將只有一個執行緒可以退出wait()方法,因為每個執行緒在退出wait()前必須獲得監視器物件的鎖。

原文: