問題不是Go編譯器最佳化,而是缺乏同步。對 i 的賦值後面沒有任何同步事件,因此不能保證任何其他 goroutine 都會觀察到它。事實上,激進的編譯器可能會刪除整個 i 語句。
Go 記憶體模型
Go 記憶體模型指定在一個變數中讀取變數的條件可以保證goroutine 觀察到在不同goroutine 中寫入同一變數所產生的值。
要串行化訪問,請使用通道操作或其他同步原語(例如在sync 和sync/atomic包。 &&&]在下面的例子中,對a的賦值後面沒有任何同步事件,所以不保證能被觀察到由任何其他goroutine 執行。語句。 函數你好(){ go func() { a = "你好" }() 列印(一) }
以下範例示範如何使用sync.Mutex.
package main 序列化對 i 的訪問 進口 ( “同步” “時間” ) 函數主() { mx := new(sync.Mutex) 我:= 1 去函數(){ 為了 { mx.Lock() 我 mx.Unlock() } }()
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3