1.使用注意點
(1)調(diào)用wait()掂碱,notify()和notifyAll()時需要先對調(diào)用對象加鎖者甲。
(2)調(diào)用wait()方法后春感,線程狀態(tài)由running變?yōu)閣aiting,并將當(dāng)前線程放到對象的等待隊列虏缸。
(3)notify()或notifyAll()方法調(diào)用之后鲫懒,等待線程依舊不會從wait()方法返回,需要調(diào)用notify()或notifyAll()的線程釋放鎖之后刽辙,等待線程才有機(jī)會從wait()返回窥岩。
(4)notify()方法將等待隊列中的一個等待線程從等待隊列中移動到同步隊列中,而notifyAll()方法則將等待線程中所有的線程全部移動到同步隊列中宰缤,被移動的線程狀態(tài)從waiting 變?yōu)閎locked
(5)從wait()方法返回的前提是獲得了調(diào)用對象的鎖颂翼。
WaitThread首先獲取了對象的鎖,然后調(diào)用對象的wait()方法慨灭,從而放棄了鎖并進(jìn)入了對象的等待隊列WaitQueue中朦乏,進(jìn)入等待狀態(tài)。由于WaitThread釋放了對象的鎖氧骤。
NotifyThread隨后獲取了對象的鎖呻疹,并調(diào)用對象的notify()方法,將WaitThread從WaitQueue移到SynchronizedQueue中筹陵,此時WaitThread的狀態(tài)變?yōu)樽枞麪顟B(tài)刽锤。NotifyThread釋放了鎖之后镊尺,WaitThread再次獲取到鎖并從wait()方法返回繼續(xù)執(zhí)行。