之前我們探討了Race Condition,要避免Race Condition
可以使用Mutex.
來看以下範例:
// hello75
package main
import (
"fmt"
"runtime"
"sync"
"time"
)
var (
九陰真經 string
wg sync.WaitGroup
mutex sync.Mutex
)
func 油達大師() {
defer wg.Done()
// 鎖定資源
mutex.Lock()
// 第一次取值並寫回
runtime.Gosched()
context := 九陰真經
context += " 拜師油達"
九陰真經 = context
// 解鎖資源
mutex.Unlock()
time.Sleep(time.Millisecond)
// 第二次取值並寫回
// 鎖定資源
mutex.Lock()
context = 九陰真經
runtime.Gosched()
context += " 月繳300"
九陰真經 = context
// 解鎖資源
mutex.Unlock()
}
func 玉面飛鷹() {
defer wg.Done()
// 鎖定資源
mutex.Lock()
// 第一次取值並寫回
context := 九陰真經
runtime.Gosched()
context += " 我也有教"
九陰真經 = context
// 解鎖資源
mutex.Unlock()
time.Sleep(time.Millisecond)
// 第二次取值並寫回
// 鎖定資源
mutex.Lock()
context = 九陰真經
runtime.Gosched()
context += " 只收200"
九陰真經 = context
// 解鎖資源
mutex.Unlock()
}
func main() {
runtime.GOMAXPROCS(2)
wg.Add(2)
九陰真經 = "欲練此功"
go 油達大師()
go 玉面飛鷹()
wg.Wait()
fmt.Println("真經內容:", 九陰真經)
}
執行結果:
./hello75
真經內容: 欲練此功 拜師油達 我也有教 月繳300 只收200
現在就一人補一句廣告,交錯開來了.