1. 程式人生 > >notify和notifyAll的一段兒程式碼分析

notify和notifyAll的一段兒程式碼分析

現在的情況是,C1和C2都在試圖去獲取同步鎖,這兩個執行緒只能有一個被選擇進入方法,另一個則會被堵塞(不是waiting,而是blocked 。譯者注:雖然C1已經在方法中,不過還是會和C2競爭鎖,如果C2獲得鎖,則C2進入方法執行接下來的操作,而C1還是繼續等待鎖(處於blocked狀態);如果C1獲得鎖,則C1往下執行,而C2還是會被擋在方法外面(處於blocked狀態))。假如C2先獲得了物件鎖,C1仍然被阻擋著(此時C1還試圖在X處獲得鎖),C2完成了方法,並釋放了鎖。現在C1獲得了鎖。假設這裡沒有while迴圈,那麼C1就會往下執行,從buf中刪除一個物件,但是此時buf中已經沒有物件了,因為剛剛C2已經取走了一個物件,如果此時C1執行buf.remove(0),則會報IndexArrayOutOfBoundsException異常。為了防止這樣的異常發生,我們在上面用到了while迴圈,在往下執行之前,判斷此時buf的大小是否為0,如果不是0,則往下執行,如果是0,則繼續wait()。