天天看點

wait,notify,notifyAll用法解析

在并發開發中,鎖是非常常見的,而wait/notify也經常會和鎖一起使用,例如在生産者消費者模式中。而且wait/notify也必須和鎖一起使用,因為它們都是基于對象的,否則會抛出異常。

下面,我們通過一段簡單的代碼,來了解以下wait/notify的用法:

運作結果如下:

我們發現,線程2運作完成之後,線程3和線程4還是繼續會等待,是以notify方法隻會喚醒一個進入wait的線程,并且是第一個進入的。如果使用notifyAll,運作結果如下:

由此我們可以分析出:使用notifyAll會将所有的線程都喚醒,喚醒之後,誰先擷取到CPU資源,誰就先執行,是以這三個線程的執行順序出現了變化。

而且,通過以上代碼,我們可以知道wait的一個特性:當線程進入wait狀态時,該線程會将鎖資源釋放,其他的線程就可以進來,而當它再次被喚醒時,就可以再次去搶奪鎖資源了。