package lock_unlockimport ( "fmt" "sync")var ( num = 100 wg sync.WaitGroup n sync.Mutex)func main() { //互斥鎖 //go語言中多個協程操做一個變量時會出現衝突的問題 //go eun -race main.go 能夠直接查看競爭 //能夠使用sync.Mutex對內容進行加鎖,但會使效率下降()這就要平衡安全與效率的關係 //互斥鎖的使用場景 ////一、多個goroutine訪問一個代碼段 ////二、這個函數操做一個全局變量 ////三、爲了保證共享變量安全性,值合法性 //使用互斥鎖模擬售票窗口 wg.Add(10) for i := 0; i < 10; i++ { go demo() } wg.Wait() //讀寫鎖 //能夠有有多個讀鎖,只能有一個寫鎖 var rwm sync.RWMutex var wg sync.WaitGroup m := make(map[int]int) wg.Add(10) for i := 0; i < 10; i++ { go func(j int) { rwm.Lock() m[j] = j //寫鎖 fmt.Println(m) //堵鎖 map不是線程安全,多個goroutine同時操做map,則必須加上讀寫鎖 //讀寫鎖鎖的是所在範圍內的數據讀寫操做(即多個協程能同時進行,但每一個線程內的讀寫是加鎖的) //互斥鎖鎖的是那段代碼(即一次性只能運行一個協程) wg.Done() rwm.Unlock() }(i) } wg.Wait()}func demo() { n.Lock() //執行demo時加鎖 經過終端執行go eun -race main.go可看到沒有資源競爭 for i := 0; i < 10; i++ { num = num - 1 } n.Unlock() wg.Done()}