知识点 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()}
相关文章
相关标签/搜索