美文网首页jraft
jraft源码阅读9一读写锁

jraft源码阅读9一读写锁

作者: 黄云斌huangyunbin | 来源:发表于2019-04-13 16:24 被阅读0次

很多人看代码的时候,可能比较疑惑,为什么要加读写锁。

raft处理写请求的流水线的消费者都是单线程的,完全没有并发问题,但是还要处理读请求了,如果写了一半的被读的线程看到了,数据就不准了。同时为了高性能,就使用读写锁了。

1 写请求,加写锁
image.png
2 读请求,加读锁
image.png
3 相关流程都加读写锁

NodeImpl是流程的入口,流程的其他环境也都是类似的,这里就不赘述了。

4 设计的利弊

很多地方都要考虑要不要加锁,加读锁还是写锁,加的锁还要保证正常释放掉。对人的心智负担还是有些的。

我们一些场景的做法是:把要操作的数据聚焦到一个对象,用copy-on-write的思想,复制一份改完,指像新的引用。这样就不用加锁了。对于这种读多写少的情况也是挺适合的。
不过copy-on-write的关键在于:
1 能不能把要修改的数据聚集起来
2 对象是不是很大,大对象复制的成本不小,对gc也会有些压力

相关文章

  • jraft源码阅读9一读写锁

    很多人看代码的时候,可能比较疑惑,为什么要加读写锁。 raft处理写请求的流水线的消费者都是单线程的,完全没有并发...

  • Java 读写锁 ReentrantReadWriteLock

    本文内容:读写锁 ReentrantReadWriteLock 的源码分析,基于 Java7/Java8。 阅读建...

  • go RWMutex源码解析

    RWMutex 基于go 1.13源码总的来说读写锁就是利用互斥锁和CAS维护2个关于读锁的变量以及runtime...

  • J.U.C中的读写锁

    本文从源码角度解析读写锁,其实读写锁实现并不复杂,真正的难点还是AQS。如果对这方面不熟悉可以参考这篇文章AQSR...

  • [Java源码][并发J.U.C]---解析ReentrantR

    前言 本文将分析读写锁ReentrantReadWriteLock的源码,也会在分析中穿插一些例子来加深对源码的理...

  • jraft源码阅读6一snapshot快照

    随着时间越长,raft的log就越多,占用磁盘多,对后面加入的follower跟上leader也是个灾难。所以就有...

  • jraft源码阅读4一leader选举

    1 定时器,一直没收到leader的心跳,就尝试选举自己 2 预选 如果超过半数以上预选成功,才开始正式选举自己...

  • java读写锁源码分析

    . ReentrantReadWriteLock 定义 ReentrantReadWriteLock: Reent...

  • 读写锁ReadWriteLock源码分析

    示例代码: 打印输出: 可以看出,读锁是共享锁。一个线程在读没结束时,其他读线程也可以读。 ReadWriteLo...

  • 读写锁和互斥锁 读写互斥锁,简称读写锁 mux sync.RWMutex Lock和Unlock分别对写锁进行锁定...

网友评论

    本文标题:jraft源码阅读9一读写锁

    本文链接:https://www.haomeiwen.com/subject/hjtrwqtx.html