private int i = 0;
private synchronized void inc() { i++; println(Thread.name + "--inc--" + i); }
private synchronized void dec() { i--; println(Thread.name + "--dec--" + i); }
// 創建 2 個 inc 線程,2 個 dec 線程並發啟動
用戶預期順序:兩個 inc 先跑完(i=2),再跑 dec(i=0)。實際輸出交錯亂序。
線程啟動 ≠ 線程立即執行。thread.start() 僅將線程置為就緒狀態,具體何時獲得 CPU 時間片、以何順序執行,由操作系統線程調度器決定,受 CPU 核心數、負載、優先級、時間片輪轉等因素影響,不可預測。
多次運行程序,觀察輸出每次不同,證明調度隨機性。
synchronized 保證 inc/dec 方法原子性(不會出現 i 更新丟失)。synchronized 不保證線程執行順序,僅保證併發安全。需顯式協調機制:
CountDownLatch / CyclicBarrier 等待特定線程完成。wait/notify 或 Lock/Condition 實現嚴格交替。面試核心考點:理解線程生命週期、調度非確定性、同步與順序的區別。