問題不是 Go 編譯器最佳化,而是缺乏同步。對 i 的賦值後面沒有任何同步事件,因此不能保證任何其他 goroutine 都會觀察到它。事實上,激進的編譯器可能會刪除整個 i 語句。
Go 記憶體模型
Go 記憶體模型指定在一個變數中讀取變數的條件可以保證goroutine 觀察到在不同goroutine 中寫入同一變數所產生的值。
要序列化訪問,請使用通道操作或其他同步原語(例如sync和sync/atomic包中的同步原語)保護資料.
如果您必須閱讀本文檔的其餘部分才能理解程式的行為,那您就太聰明了。別自作聰明。
同步
在下面的範例中,對 a 的賦值後面沒有任何同步事件,因此不保證能夠被觀察到由任何其他 goroutine 執行。事實上,激進的編譯器可能會刪除整個 go 語句。
<code class="go">var a string func hello() { go func() { a = "hello" }() print(a) }</code>
以下範例示範如何使用sync.Mutex 序列化對 i 的存取。
<code class="go">package main import ( "sync" "time" ) func main() { mx := new(sync.Mutex) i := 1 go func() { for { mx.Lock() i++ mx.Unlock() } }() <-time.After(1 * time.Second) mx.Lock() println(i) mx.Unlock() }</code>
以上是為什麼我的 Goroutine 的值對其他人不可見?的詳細內容。更多資訊請關注PHP中文網其他相關文章!