首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 多線程同步:if-else 結構導致 wait/notify 配對失衡輸出異常

     編輯:程式設計綜合問答

現象

兩線程交替打印,用 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() 下一行繼續執行**。
  • 版本 A:喚醒後執行 print(),然後循環到下一輪再次判斷 if 並 wait()。
  • 版本 B:喚醒後執行 print(),**方法結束直接返回調用處**,else 分支不再執行,導致該輪打印缺失。

修正:統一用 while 循環 + 狀態機


synchronized (lock) {
    while (true) {
        while (flag != myTurn) {
            lock.wait();
        }
        print();
        flag = nextTurn;
        lock.notifyAll();
    }
}

關鍵點

  1. wait() 必須在 while(條件) 循環中,防止虛假喚醒。
  2. 避免在同步塊中使用 if-else 分支包裹 wait(),導致控制流混亂。
  3. 用 notifyAll() 而非 notify() 避免信號丟失(多線程等待同一鎖時)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved