前言
同步競爭(Race Condition)是指說某個資料因為多個行程而導致最終資料不正確的狀況
這其實滿淺顯易懂的,但懂歸懂有時候還是會忽略到一些狀況。
介紹
我們先來看下面的程式碼
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
| package main
import ( "fmt" "time" )
func foo(a *int) { *a = *a + 3 fmt.Println("a = ", *a) if *a%3 == 0 { fmt.Println("Hello foo") } }
func boo(b *int) { *b = *b + 5 fmt.Println("b = ", *b) if *b%3 == 0 { fmt.Println("Hello boo") } }
func main() { a := 0 go func() { for i := 0; i < 3; i++ { foo(&a) } }()
go func() { for i := 0; i < 3; i++ { boo(&a) } }()
time.Sleep(1 * time.Second) }
|
在這段 Code 中,我期待每次用 foo()
和 boo()
都會跑裡面的條件式
但實際上發生什麼事我們來看看
1 2 3 4 5 6 7 8 9 10
| b = 8 b = 13 b = 18 Hello boo a = 3 Hello foo a = 21 Hello foo a = 24 Hello foo
|
發現了嗎,不只是條件式沒有跑出來,連同 b 和 a 的順序不同,這到底是為什麼
為什麼會發生
因為在這段 Code 中,我們會看到 foo()
和 boo()
會是併發的狀況,變成是這兩者不再是照順序執行的且 function 中傳遞的還是指標,所以在這個情況下,就會同時修改同一個記憶體位址的值