iT邦幫忙

DAY 23
0

蠻可愛的 Golang系列 第 23

使用Mutex來鎖定資源

之前我們探討了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

現在就一人補一句廣告,交錯開來了.


上一篇
再探Race Condition
下一篇
油達大師 vs 玉面飛鷹
系列文
蠻可愛的 Golang30

尚未有邦友留言

立即登入留言