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

Java 多線程面試題:四線程增減共享變量,輸出順序不確定

     編輯:程式設計疑難解答

題目代碼

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 實現嚴格交替。
  • 單線程串行執行(失去併發意義)。

面試核心考點:理解線程生命週期、調度非確定性、同步與順序的區別。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved