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

Java 生產者-消費者模式:為何消費者先輸出?執行緒排程非決定性

     編輯:程式設計綜合問答

現象

主執行緒先 new Thread(producer).start() 再 new Thread(consumer).start(),但控制台先印出「消費了=...」。

核心解釋:執行緒啟動 ≠ 立即執行,排程器決定誰先跑

  • start() 僅向 JVM 登記「這個執行緒準備好可執行」。
  • 實際何時獲得 CPU 時間片、執行第一條指令,**完全由作業系統排程器決定**,與代碼書寫順序無關。
  • 消費者執行緒可能先搶到 CPU、先進入 pop()、發現緩衝區空 → wait() 釋放鎖,生產者隨後執行 push() → notify() 喚醒消費者,最終交錯執行。

同步機制驗證

程式碼中 SyncStack 使用 synchronized + wait/notify 正確實現了「緩衝區滿等待、空等待、生產通知消費、消費通知生產」。無論誰先跑,**邏輯永不死鎖、資料不會丟失**。

觀察建議

  • 在 push/pop 開頭印 Thread.currentThread().getName(),觀察交替執行順序。
  • 加大 Thread.sleep 隨機範圍,讓交錯更明顯。

結論

多執行緒**本質是非決定性**的。正確性不依賴「誰先跑」,而依賴**共享狀態的同步協議**(鎖、條件變數、原子變數)。

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