多線程等待/通知機制中,notify() 喚醒單一線程,notifyAll() 喚醒所有等待線程。許多開發者錯誤假設喚醒順序遵循優先級或等待時長,實則 JVM 規範不保證任何喚醒順序,完全依賴實現。
Tom Cargill 提出,為每組需協同喚醒的線程分配獨立鎖物件,透過釋放特定鎖實現可控通知順序。實現成本低,但增加編碼複雜度。
javax.realtime 保證等待隊列按優先級排序,notify/notifyAll 喚醒最高優先級線程。代價:鎖定特定 JVM,犧牲可移植性。原則:及時性優於執行速度,僅適用硬實時系統。
notifyAll() 而非 notify(),避免信號遺失導致線程永久飢餓CountDownLatch、CyclicBarrier)Thread.setPriority() 控制業務邏輯順序Java 線程喚醒機制刻意不指定順序,賦予 JVM 實現最大優化彈性。開發者應接受非確定性,使用標準併發工具類(JDK 1.5+ java.util.concurrent)構建可靠的同步協議,而非依賴不可移植的調度行為。