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()}