知识点 lock/unlock

package lock_unlock

import (
"fmt"
"sync"
)

var (
num = 100
wg sync.WaitGroup
n sync.Mutex
)

func main() {
//互斥锁
//go语言中多个协程操作一个变量时会出现冲突的问题
//go eun -race main.go 可以直接查看竞争
//可以使用sync.Mutex对内容进行加锁,但会使效率降低()这就要平衡安全与效率的关系
//互斥锁的使用场景
////1、多个goroutine访问一个代码段
////2、这个函数操作一个全局变量
////3、为了保证共享变量安全性,值合法性
//使用互斥锁模拟售票窗口

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()
}
posted @ 2019-08-17 15:44  初见未来  阅读(882)  评论(0编辑  收藏  举报