【转】golang 锁使用---里面的读写锁解析
原文:https://www.jianshu.com/p/6b3e5a57a4cd
参考: https://studygolang.com/articles/2497
--------------------------------
关于读写锁的问题,其实概念上大致就是调用写锁方法阻塞所有方法,调用读锁方法阻塞所有写方法,读方法可以并发执行。
网上的例子往往太过于简单,非常容易误导,并且读写锁跟排他锁,信道不一样,概念稍微绕了一些,因此记录一下。
网上的例子往往太过于简单,非常容易误导,并且读写锁跟排他锁,信道不一样,概念稍微绕了一些,因此记录一下。
package main import ( "log" "runtime" "sync" "time" ) var rwMutex sync.RWMutex func runReadLock() { log.Println("来到读锁方法") rwMutex.RLock() // 与写锁构成互斥,在读的时候不允许写 defer rwMutex.RUnlock() log.Println("运行的是上读锁方法,并不一定要读数据,这里休眠10秒") time.Sleep(time.Second * 10) } func runWriteLock() { log.Println("来到写锁方法") rwMutex.Lock() defer rwMutex.Unlock() log.Println("运行的是上写锁方法,并不一定要写数据,这里休眠10秒") time.Sleep(time.Second * 10) } func main() { runtime.GOMAXPROCS(10) for q := 0; q < 2; q++ { go runWriteLock() } for k := 0; k < 3; k++ { go runReadLock() } time.Sleep(time.Second * 1000) }
运行结果
第一种情况:
第二种:
第三种:
第四种:
第五种: