文章目录
- 读写锁互斥:基于AQS的state二进制高低16位完成互斥判断
- `state`变量的位分配
- 读写锁互斥判断
- 代码实现
- 总结
- 释放写锁的源码剖析以及对AQS队列唤醒阻塞线程的过程
- 释放写锁的源码
- AQS的`release`方法
- 唤醒等待线程
- 总结
- 基于CAS实现多线程并发同时只有一个可以加读锁
- 使用CAS实现单读者锁
- 加锁操作
- 伪代码
- 注意事项
- 结论
- 多线程加读锁时的重复循环自旋尝试完成加锁
- 自旋加读锁的实现
- 自旋锁的优缺点
- 优化自旋锁
- 再次回头看看读锁占用时加写锁失败如何入队阻塞等待
- 读锁占用时加写锁失败的处理
- 入队和阻塞等待
- 阻塞等待期间
- 唤醒阻塞线程
- 总结
- 读锁释放过程分析以及如何基于AQS唤醒阻塞加写锁的线程
- 读锁释放过程
- 基于AQS唤醒等待写锁的线程
- 总结
- 如何用Condition实现wait和notify的效果
- 创建Condition对象
- 使用Condition实现wait和notify
- 1. 使用`await`代替`wait`
- 2. 使用`signal`代替`notify`
- 3. 使用`signalAll`代替`notifyAll`
- 总结
- 基于AQS实现的Condition阻塞过程源码分析
- AQS中的Condition实现
- Condition阻塞过程分析
- 1. 调用`await`方法
- 2. 添加等待节点
- 3. 释放锁
- 4. 等待状态
- 5. 唤醒和重新获取锁
- 总结
- 基于AQS实现的Condition唤醒阻塞线程的源码分析
- 唤醒流程概览
- 1. `signal`方法分析
- 2. `signalAll`方法分析
- 3. `transferForSignal`方法
- 总结
- AQS案例实战:服务注册表的多线程并发读写场景分析
- 场景描述
- 解决方案
- 实现细节
- 1. 定义读写锁
- 2. 读操作
- 3. 写操作
- 总结
- AQS案例实战:基于读写锁优化服务注册表的读写加锁操作
- 设计思路
- 实现方案
- 1. 引入读写锁
- 2. 优化读操作
- 3. 优化写操作
- 总结
AQSstate16_1">读写锁互斥:基于AQS的state二进制高低16位完成互斥判断
在ReentrantReadWriteLock
中,读写锁的互斥性是通过AQS(AbstractQueuedSynchronizer)的state
变量的不同位来实现的。state
变量是一个32位的整数,被分为两部分,高位用于表示写锁的状态,而低位用于表示读锁的状态。这种设计允许读写锁在读操作和写操作之间实现互斥,同时允许多个读操作并行执行。
state
变量的位分配
具体来说,state
变量的高位(例如,第16位到第31位)表示写锁的状态。如果这些位的值不为0,表示有线程持有写锁。低位(第0位到第15位)表示读锁的计数,每有一位线程获取读锁,低位的值就增加1。
读写锁互斥判断
在尝试获取读锁或写锁时,ReentrantReadWriteLock
会检查state
变量的相应位,以判断是否可以获取锁:
-
读锁获取:当尝试获取读锁时,会检查
state
变量的高位是否为0,即没有写锁被持有。如果高位为0,表示没有写锁被持有,可以安全地获取读锁,同时增加低位的读锁计数。 -
写锁获取:当尝试获取写锁时,会检查
state
变量的高位是否为0&#