Go语言中互斥锁与读写锁,你知多少?( 二 )

反复执行上述示例中,可以看到,写锁定会阻塞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语言中互斥锁与读写锁,你知多少?】


推荐阅读