V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
CodeCodeStudy
V2EX  ›  Java

为什么 ReentrantReadWriteLock 用一个变量来表示读锁和写锁的计数?

  •  
  •   CodeCodeStudy · 2022-06-14 10:15:23 +08:00 · 1613 次点击
    这是一个创建于 675 天前的主题,其中的信息可能已经有所发展或是发生改变。
    版本为 openjdk8 ,源码在 java.util.concurrent.locks.ReentrantReadWriteLock ,268 行左右

    static final int SHARED_SHIFT = 16;

    ststatic final int EXCLUSIVE_MASK = (1 << SHARED_SHIFT) - 1;

    static int sharedCount(int c) { return c >>> SHARED_SHIFT; }

    static int exclusiveCount(int c) { return c & EXCLUSIVE_MASK; }

    读锁和写锁的计数只用了一个变量来表示,也就是上述代码里的变量 c ,为什么不用两个变量来分别表示读锁和写锁计数呢?
    7 条回复    2022-06-15 08:55:32 +08:00
    codehz
        1
    codehz  
       2022-06-14 10:24:47 +08:00 via iPhone
    两个变量那还得处理这两个变量的同步问题了,是不是还得加一个锁去保证呢(笑
    huang119412
        2
    huang119412  
       2022-06-14 11:21:57 +08:00
    Doug Lea 的编程习惯,极致的优化。这种情况很多,比如 ThreadPoolExecutor 中 ctl 一个字段表示线程数和线程池状态。好处是节省了内存,判断逻辑代码更少,并且没有伪共享问题,缺点是对普通人来说可读性变差了。毕竟是基础库,性能更重要。自己写代码的话,没必要这样。
    TWorldIsNButThis
        3
    TWorldIsNButThis  
       2022-06-14 11:30:54 +08:00 via iPhone
    @huang119412 可读性主要是 java 的问题
    随便一个支持 extension 、inline 的语言在这个场景都能做到无损提升可读性
    Rumble66
        4
    Rumble66  
       2022-06-14 12:55:34 +08:00
    这两个计算变量是用 AQS 的 state 拆分得来, 随你 ReadWriteLock 怎么拆分定义 state, aqs 只有一个, ReadWriteLock 这里可以看作两个变量啊
    DonaldY
        5
    DonaldY  
       2022-06-14 15:15:37 +08:00
    高低端位,分别表示,还行吧
    LeegoYih
        6
    LeegoYih  
       2022-06-14 15:20:46 +08:00
    MoonWalker
        7
    MoonWalker  
       2022-06-15 08:55:32 +08:00
    4 楼说的对。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   2755 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 12:49 · PVG 20:49 · LAX 05:49 · JFK 08:49
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.