反复执行上述示例中,可以看到,写锁定会阻塞goroutine 最开始先在main中sleep 100ms ,保证子的goroutine会全部执行,而每个子goroutine会sleep 2s 。此时会阻塞整个main进程,当所有子goroutine执行结束,读解锁后,main的写锁定才会执行 。
再看一个读锁定示例:
func rwMutex5() { var rwm sync.RWMutex for i := 0; i <= 2; i++ { go func(i int) { fmt.Printf("go(%d) start lockn", i) rwm.RLock() fmt.Printf("go(%d) lockedn", i) time.Sleep(time.Second * 2) rwm.RUnlock() fmt.Printf("go(%d) unlockn", i) }(i) } fmt.Println("main start lock") rwm.RLock() fmt.Println("main locked") time.Sleep(time.Second * 10)}main start lockmain lockedgo(1) start lockgo(1) lockedgo(2) start lockgo(2) lockedgo(0) start lockgo(0) lockedgo(0) unlockgo(1) unlockgo(2) unlock可以看到读锁定却并不会阻塞goroutine 。
总结:
- 读锁定和写锁定对于写操作都是互斥的
- 读锁定支持多级嵌套,但写锁定无法嵌套执行
- 如果有写锁定,当多个读解锁全部执行完成后,则会唤起执行写锁定
- 写锁定会阻塞goroutine(在Lock()时和互斥锁一样,RLock()时先也是等到RUnlock()先执行,才有锁定机会)
【Go语言中互斥锁与读写锁,你知多少?】
推荐阅读
- 每日正能量语录:善良的心,就是太阳 善良的心就是太阳
- 有龙字的成语龙凤呈祥 有龙字的成语
- 梦见着火了自己去灭火梦见女同学向我问一下英语问题 梦见着火了自己去灭火还担心别人误会
- 语文书灵异事件照片 四年级语文书上的诡异照片
- 深山含笑花语 深山含笑介绍
- Python打牢基础,从12个语法开始
- 开天眼念什么咒语 开天眼咒开天眼咒语
- 英语写作万能模板 英语万能作文模板
- 不足为外人道成语故事 不足为外人道也
- 平安夜快乐英文怎么说 平安夜快乐的英语