知識點 lock/unlock

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()}
相關文章
相關標籤/搜索