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

2022-06-14 10:15:23 +08:00
 CodeCodeStudy
版本为 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 ,为什么不用两个变量来分别表示读锁和写锁计数呢?
1914 次点击
所在节点    Java
7 条回复
codehz
2022-06-14 10:24:47 +08:00
两个变量那还得处理这两个变量的同步问题了,是不是还得加一个锁去保证呢(笑
huang119412
2022-06-14 11:21:57 +08:00
Doug Lea 的编程习惯,极致的优化。这种情况很多,比如 ThreadPoolExecutor 中 ctl 一个字段表示线程数和线程池状态。好处是节省了内存,判断逻辑代码更少,并且没有伪共享问题,缺点是对普通人来说可读性变差了。毕竟是基础库,性能更重要。自己写代码的话,没必要这样。
TWorldIsNButThis
2022-06-14 11:30:54 +08:00
@huang119412 可读性主要是 java 的问题
随便一个支持 extension 、inline 的语言在这个场景都能做到无损提升可读性
Rumble66
2022-06-14 12:55:34 +08:00
这两个计算变量是用 AQS 的 state 拆分得来, 随你 ReadWriteLock 怎么拆分定义 state, aqs 只有一个, ReadWriteLock 这里可以看作两个变量啊
DonaldY
2022-06-14 15:15:37 +08:00
高低端位,分别表示,还行吧
LeegoYih
2022-06-14 15:20:46 +08:00
MoonWalker
2022-06-15 08:55:32 +08:00
4 楼说的对。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/859460

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX