synchronized的底層實現monitor它有兩個字段:EntryList和WaitSet
鎖池(EntryList)
如果線程A擁有了某個對象的鎖的話,其他線程B、C想調用這個對象的synchronized方法(或者進入方法塊)的話,就必須獲得該對象鎖的擁有權。
而這時該對象的鎖被線程A鎖佔用,因此B、C線程就會被阻塞,進入到一個地方等待鎖的釋放,這個地方就是鎖池。
等待池(WaitSet)
假設線程A調用了某個對象的wai()方法,線程A就會釋放該對象的鎖,同時線程A就進入到該對象的等待池中,具體來說就是monitor鎖中的WaitSet中,並且進入等待池的線程都不會去競爭該對象的鎖。
區別:
notify和notifyAll的作用就是在某個線程調用了wait()方法之後,對等待池中的這些線程進行一個喚醒操作,區別就是
notify只會隨機選取一個處於等待池中的線程進入鎖池去競爭獲取鎖的機會
notifyAll會讓所有處於等待池的線程全部進入鎖池去競爭獲取鎖的機會