更新時(shí)間:2023-06-28 來(lái)源:黑馬程序員 瀏覽量:
wait()、notify()和notifyAll()是Java中用于線(xiàn)程間通信的方法,它們必須與synchronized關(guān)鍵字一起使用。接下來(lái)筆者將詳細(xì)解釋為什么要這樣使用。
在Java中,synchronized關(guān)鍵字用于實(shí)現(xiàn)線(xiàn)程的互斥訪(fǎng)問(wèn),即同一時(shí)刻只能有一個(gè)線(xiàn)程執(zhí)行被synchronized關(guān)鍵字包裹的代碼塊或方法。這樣可以確保在共享資源上的操作是線(xiàn)程安全的。
wait()方法用于使當(dāng)前線(xiàn)程進(jìn)入等待狀態(tài),直到其他線(xiàn)程調(diào)用相同對(duì)象的notify()或notifyAll()方法來(lái)喚醒它。當(dāng)一個(gè)線(xiàn)程調(diào)用wait()方法時(shí),它會(huì)釋放當(dāng)前持有的鎖,允許其他線(xiàn)程進(jìn)入臨界區(qū)并執(zhí)行相關(guān)操作。
notify()方法用于喚醒一個(gè)正在等待的線(xiàn)程。如果有多個(gè)線(xiàn)程等待,只能喚醒其中一個(gè)線(xiàn)程,具體喚醒哪個(gè)線(xiàn)程是不確定的。notifyAll()方法則會(huì)喚醒所有等待的線(xiàn)程,讓它們重新競(jìng)爭(zhēng)鎖。
現(xiàn)在我們來(lái)看看為什么wait()、notify()和notifyAll()需要與synchronized一起使用:
wait()、notify()和notifyAll()方法必須在同步塊或同步方法中調(diào)用,以確保在調(diào)用這些方法時(shí),當(dāng)前線(xiàn)程已經(jīng)獲取了對(duì)象的監(jiān)視器鎖(即通過(guò)synchronized獲取鎖),這樣才能對(duì)鎖進(jìn)行釋放或喚醒等操作。
當(dāng)一個(gè)線(xiàn)程調(diào)用wait()方法時(shí),它會(huì)釋放當(dāng)前持有的監(jiān)視器鎖,讓其他線(xiàn)程能夠獲得該鎖并執(zhí)行相關(guān)操作。當(dāng)調(diào)用notify()或notifyAll()方法時(shí),被喚醒的線(xiàn)程會(huì)重新競(jìng)爭(zhēng)獲取鎖,一旦獲取到鎖,才能繼續(xù)執(zhí)行。
wait()、notify()和notifyAll()方法是實(shí)現(xiàn)線(xiàn)程間通信的關(guān)鍵。通過(guò)調(diào)用wait()方法,線(xiàn)程可以等待某個(gè)條件的滿(mǎn)足;而通過(guò)notify()或notifyAll()方法,線(xiàn)程可以通知其他等待的線(xiàn)程條件已經(jīng)滿(mǎn)足,從而讓它們繼續(xù)執(zhí)行。
綜上所述,wait()、notify()和notifyAll()方法必須與synchronized關(guān)鍵字一起使用,以確保線(xiàn)程安全、正確釋放和恢復(fù)監(jiān)視器鎖,并實(shí)現(xiàn)有效的線(xiàn)程間通信。