读写人(读写人官网)干货分享
互斥锁的根本就是当一个goroutine访问的时候,其他goroutine都不能访问,这样肯定保证了资源的同步,避免了竞争,不过也降低了性能。
前面的有篇文章在讲资源竞争的时候,提到了互斥锁互斥锁的根本就是当一个goroutine访问的时候,其他goroutine都不能访问,这样肯定保证了资源的同步,避免了竞争,不过也降低了性能仔细剖析我们的场景,当我们读取一个数据的时候,如果这个数据永远不会被修改,那么其实是不存在资源竞争的问题的。
因为数据是不变的,不管怎么读取,多少goroutine同时读取,都是可以的所以其实读取并不是问题,问题主要是修改修改的数据要同步,这样其他goroutine才可以感知到所以真正的互斥应该是读取和修改、修改和修改之间,读取和读取是没有互斥操作的。
所以这就延伸出来另外一种锁,叫做读写锁读写锁可以让多个读操作同时并发,同时读取,但是对于写操作是完全互斥的也就是说,当一个goroutine进行写操作的时候,其他goroutine既不能进行读操作,也不能进行写操作。
package main import ( "sync""fmt""math/rand" ) var count intvar wg sync.WaitGroup var rw sync.RWMutex
funcmain() { wg.Add(10) for i:=0;i<5;i++ { go read(i) } for i:=0;i<5;i++ {
go write(i) } wg.Wait() } funcread(n int) { rw.RLock() fmt.Printf("读goroutine %d 正在读取...\n"
,n) v := count fmt.Printf("读goroutine %d 读取结束,值为:%d\n", n,v) wg.Done() rw.RUnlock() }
funcwrite(n int) { rw.Lock() fmt.Printf("写goroutine %d 正在写入...\n",n) v := rand.Intn(1000) count = v fmt.Printf(
"写goroutine %d 写入结束,新值为:%d\n", n,v) wg.Done() rw.Unlock() }我们在read里使用读锁,也就是RLock和RUnlock,写锁的方法名和我们平时使用的一样,是Lock和Unlock。
这样,我们就使用了读写锁,可以并发地读,但是同时只能有一个写,并且写的时候不能进行读操作现在我们再运行代码,可以从输出的数据看到,可以读到新值了我们同时也可以使用go build -race检测,也没有竞争提示了。
- 标签:
- 编辑:李松一
- 相关文章
-
基金会中心网(吕全斌 基金会中心网)干货分享
然而,在新的政策环境下,以慈善为导向的第三次分配成为国家基础性制度安排,企业投身公益慈善事业则应该开始更多地关注其公益慈善投入…
-
天方听书网(天方听书网app)难以置信
红星新闻记者从“网信上海”了解到,5月20日,上海市网信办联合市“扫黄打非”办、市新闻出版局。针对阅文集团旗下起点中文网对用户…
- 鹤壁高中(鹤壁高中录取分数线2023)这都可以
- 江苏建筑业网(江苏建筑业网证书查询)不看后悔
- 盛京银行网上银行(盛京银行网上银行怎么开通)一看就会
- 世界工厂网(世界工厂网app下载)硬核推荐
- 学吧导航(学吧导航官网)燃爆了