主執行緒先 new Thread(producer).start() 再 new Thread(consumer).start(),但控制台先印出「消費了=...」。
start() 僅向 JVM 登記「這個執行緒準備好可執行」。pop()、發現緩衝區空 → wait() 釋放鎖,生產者隨後執行 push() → notify() 喚醒消費者,最終交錯執行。程式碼中 SyncStack 使用 synchronized + wait/notify 正確實現了「緩衝區滿等待、空等待、生產通知消費、消費通知生產」。無論誰先跑,**邏輯永不死鎖、資料不會丟失**。
push/pop 開頭印 Thread.currentThread().getName(),觀察交替執行順序。Thread.sleep 隨機範圍,讓交錯更明顯。多執行緒**本質是非決定性**的。正確性不依賴「誰先跑」,而依賴**共享狀態的同步協議**(鎖、條件變數、原子變數)。