java多執行緒的等待和通知機制
1、通過wait和notify,notifyAll方法來配合完成
2、通過執行緒鎖(ReentrantLock)、執行緒通訊狀態(Condition)
下面只介紹第一種方法。
synchronized()用來修飾一個方法或者一個程式碼塊,保證在同一時刻最多隻有一個執行緒執行該段程式碼,它獲得了物件鎖,其它執行緒對該物件所有同步程式碼部分的訪問都被暫時阻塞。
wait()、notify()都是Object類的方法,而且必須在被同步的方法或者程式碼塊中呼叫。每一個Java物件都是直接或間接繼承Object類,所以任何Java物件都支援這種機制。等待和通知機制並不指定該條件到底是什麼。事實上,一般情況下也不需要指定。程式設計師決定一個執行緒在執行到程式碼的某處時在
當使用wait(),notify(),notifyAll()方法時,很容易出現java.lang.IllegalMonitorStateException異常。原因就是當前執行緒沒有獲得物件的鎖,或者說當前呼叫的物件不是鎖物件。常見的毛病就是使用了執行緒物件來呼叫這些方法。所以必須明白呼叫wait(),notify(),notifyAll()的物件必須是當前鎖物件。新建一個物件鎖如下:
Object sync = newObject();