notify()
和 notifyAll()
是 Java 中 Object
類的兩個(gè)方法,它們用于喚醒在此對(duì)象監(jiān)視器上等待的線程。這兩個(gè)方法的主要區(qū)別在于它們喚醒線程的方式:
notify()
:當(dāng)一個(gè)線程調(diào)用了某個(gè)對(duì)象的 notify()
方法時(shí),只有一個(gè)正在等待該對(duì)象的鎖的線程會(huì)被喚醒。具體喚醒哪個(gè)線程是不確定的,取決于操作系統(tǒng)的線程調(diào)度策略。如果有多個(gè)線程在等待,選擇哪個(gè)線程將取決于操作系統(tǒng)對(duì)多線程管理的實(shí)現(xiàn)。notifyAll()
:當(dāng)一個(gè)線程調(diào)用了某個(gè)對(duì)象的 notifyAll()
方法時(shí),所有正在等待該對(duì)象的鎖的線程都會(huì)被喚醒。應(yīng)用場(chǎng)景:
notify()
方法適用于只需要喚醒一個(gè)線程的情況,例如生產(chǎn)者-消費(fèi)者模型中,生產(chǎn)者生產(chǎn)一個(gè)產(chǎn)品后只需要喚醒一個(gè)消費(fèi)者線程來消費(fèi)。notifyAll()
方法適用于需要喚醒多個(gè)線程的情況,例如某個(gè)線程完成了一項(xiàng)任務(wù),需要喚醒其他多個(gè)線程共同處理后續(xù)工作。注意:在使用 notify()
或 notifyAll()
時(shí),必須確保它們是在同步代碼塊或同步方法中調(diào)用的,否則會(huì)拋出 IllegalMonitorStateException
異常。因?yàn)檎{(diào)用這兩個(gè)方法的線程必須是該對(duì)象的擁有者,即它必須擁有該對(duì)象的鎖。