個人理解是這樣的,不知道是否合理。 爲了效率,對內存的寫入通常會在每個處理器中緩衝,並在必要時一塊兒flush到主存。而f2沒有Sleep,致使一直沒有時間片去flush到主存,f1有Sleep,就會flush到主存,因此x值會變化,y的值沒變化。測試
若是runtime.GOMAXPROCS(1),都不會有打印信息出來。被f2獨佔spa
能夠這樣修改,就會變化code
package main import ( "fmt" "runtime" "time" ) var x, y int func main() { fmt.Println(runtime.NumCPU()) runtime.GOMAXPROCS(3) go f1(&x) go f2(&y) for { time.Sleep(time.Second * 1) fmt.Println("x:", x, "y", y) } } func f1(x *int) { for { *x = *x + 1 time.Sleep(time.Second * 1) } } func f2(y *int) { for { *y = *y + 1 } }