iT邦幫忙

DAY 21
0

蠻可愛的 Golang系列 第 21

Race Condition

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的現象.
為何會如此? 如何避免呢?
且待明日分解.


上一篇
goroutine之間的切換
下一篇
再探Race Condition
系列文
蠻可愛的 Golang30

尚未有邦友留言

立即登入留言