图文并茂 | 聊聊ReentrantReadWriteLock的位运算

本文通过解析ReentrantReadWriteLock的源码,详细介绍了位运算如何用于实现读写锁状态的高效管理。通过高位和低位切割,将int变量同时维护读锁和写锁的状态,节省资源。文章还探讨了位运算如右移、与、或在实现中的作用,并提供了int与字节的转换方法。
摘要由CSDN通过智能技术生成

我相信不少读者,在看JDK源码时,会看到位运算代码,可能有些人和阿星一样是转行的,缺乏计算机相关的基础知识,看的是一头雾水。

导致有些人直接被劝退,也有些人选择理解字面上的意思,细节跳过。

但是一颗疑惑的种子在我们心中埋了下来「为什么使用位运算就能达到这样的效果?」。

恰好ReentrantReadWriteLock读写状态的设计用到了位运算,我们以此来展开今天的话题。

一段位运算代码

我们来到ReentrantReadWriteLock.Sync内部类,发现了这段代码(后面以RRW简称

        
//偏移位数
static final int SHARED_SHIFT = 16;
//读锁计数基本单位
static final int SHARED_UNIT = (1 << SHARED_SHIFT);
//读锁、写锁可重入最大数量
static final int MAX_COUNT = (1 << SHARED_SHIFT) - 1;
//获取低16位的条件
static 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; }

上面的这些位运算代码是用来干嘛的?

因为RRW的中的int整型变量state要同时维护读锁、写锁两种状态,所以RRW的是通过高低位切割来实现。

int4个字节,一个字节8位,总共32位,切割一下,高16位表示读,低16位表示写。

这样做的好处就是节约资源,就像现实中老板把你一个人当两个人用是一样的道理。

讲到这里,大家也明白了,上面的位运算代码就是完成高低位切割的。

读锁位运算

//偏移位数
static final int SHARED_SHIFT = 16;
//读锁计数基本单位
static final int SHARED_UNIT &#
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值