兩線程交替打印,用 if(flag==0) 正常,改用 if-else 導致部分輸出缺失。
// 版本 A:兩個獨立 if
if (flag == 0) { wait(); print(); }
if (flag == 1) { wait(); print(); } // 被喚醒後繼續執行
// 版本 B:if-else
if (flag == 0) { wait(); print(); }
else { wait(); print(); } // 被喚醒後跳過 else 分支,不打印
wait() 釋放鎖並阻塞,被 notify() 喚醒後**從 wait() 下一行繼續執行**。print(),然後循環到下一輪再次判斷 if 並 wait()。print(),**方法結束直接返回調用處**,else 分支不再執行,導致該輪打印缺失。
synchronized (lock) {
while (true) {
while (flag != myTurn) {
lock.wait();
}
print();
flag = nextTurn;
lock.notifyAll();
}
}
wait() 必須在 while(條件) 循環中,防止虛假喚醒。if-else 分支包裹 wait(),導致控制流混亂。notifyAll() 而非 notify() 避免信號丟失(多線程等待同一鎖時)。