Race Condition相信大家或多或少都有聽過.
今天請油達大師與玉面飛鷹來示範一下Race Condition.
// hello74
package main
import (
"fmt"
"runtime"
"sync"
)
var (
九陰真經 string
wg sync.WaitGroup
)
func 油達大師() {
defer wg.Done()
// 第一次取值並寫回
context := 九陰真經
runtime.Gosched()
context += " 拜師油達"
九陰真經 = context
// 第二次取值並寫回
context = 九陰真經
runtime.Gosched()
context += " 月繳300"
九陰真經 = context
}
func 玉面飛鷹() {
defer wg.Done()
// 第一次取值並寫回
context := 九陰真經
runtime.Gosched()
context += " 我也有教"
九陰真經 = context
// 第二次取值並寫回
context = 九陰真經
runtime.Gosched()
context += " 只收200"
九陰真經 = context
}
func main() {
wg.Add(2)
九陰真經 = "欲練此功"
go 油達大師()
go 玉面飛鷹()
wg.Wait()
fmt.Println("真經內容:", 九陰真經)
}
執行結果:
./hello74
真經內容: 欲練此功 我也有教 只收200
雖然油達大師,也有寫回,但是好像無效.
九陰真經被玉面飛鷹寫了招生廣告了.
這就是Race Condition的現象.
為何會如此? 如何避免呢?
且待明日分解.