1.互斥鎖用於在代碼上創建一個臨界區,保證同一時間只有一個goroutine可以執行這個臨界區代碼
2.Lock()和Unlock()定義臨界區
package main
import (
"fmt"
"runtime"
"sync"
)
var (
//全局變量
counter int64
//計數信號量
wg sync.WaitGroup
//mutex定義一段代碼臨界區
mutex sync.Mutex
)
func main() {
fmt.Println("hello")
//計數加2,等待兩個goroutine
wg.Add(2)
go incCounter()
go incCounter()
//主goroutine等待子goroutine結束
wg.Wait()
fmt.Println("最終counter值:", counter)
}
//增加counter的值函數
func incCounter() {
//函數結束,減小信號量
defer wg.Done()
for count := 0; count < 2; count++ {
//創建這個臨界區
//同一時刻只允許一個goroutine進入
mutex.Lock()
//使用大括號只是為了讓臨界區看起來更清晰,並不是必須的
{
value := counter
//強制調度器切換
runtime.Gosched()
value++
counter = value
}
mutex.Unlock()
}
}
