聊聊Java中的wait、notify及notifyAll方法

聊聊Java中的wait、notify及notifyAll方法

wait方法會導致當前線程等待直到其他線程調用這個對象的notify()方法或者notifyAll()方法,或者到達了指定的時間。

當前線程必須擁有這個對象的鎖。

這個方法造成當前線程(叫做T)將它自己放入這個對象的等待集合,然後放棄任何

虛假喚醒

關於wait與notify和notifyAll方法的總結:

1.當調用wait時,首先需要確保調用了wait方法的線程已經持有了對象鎖;

2.當調用wait後,該線程就會釋放掉這個對象鎖,然後進入到等待狀態(wait set);

3.當線程調用了wait後進入到等待狀態時,它就可以等待其他線程調用相同對象的notify或notifyAll方法來使得自己被喚醒;

4.一旦這個線程被其他線程喚醒後,該線程就會與其他線程一同開始競爭這個對象的鎖(公平競爭),只有當該線程獲取到了這個對象鎖後,線程才繼續往下執行。

5.調用wait方法的代碼片段需要放在一個synchronized塊或synchronized方法中,這樣纔可以保證線程在調用wait方法錢已經獲取到了對象的鎖;

6.當調用對象的notify方法時,它會隨機喚醒該對象等待集合(wait set)中的任意一個線程,當某個線程被喚醒後,它就會與其他線程一同競爭對象的鎖;

7.當調用對象的notifyAll方法時,它會喚醒該對象等待集合(wait set)中的所有線程,這些線程被喚醒後,又開始競爭對象的鎖;

8.在某一時刻,只有唯一一個線程可以擁有對象的鎖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章