聊聊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.在某一時刻,只有唯一一個線程可以擁有對象的鎖。