Java中ReentrantReadWriteLock源码深度解析
目录
引言
ReentrantReadWriteLock
是Java并发包中的一个读写锁实现类,它允许多个读线程同时访问共享资源,但写线程必须独占资源。ReentrantReadWriteLock
通过读锁和写锁分离的方式,提高了并发性能。本文将从源码的角度深入分析ReentrantReadWriteLock
的实现原理。
ReentrantReadWriteLock的数据结构
ReentrantReadWriteLock
的核心数据结构是一个内部类Sync
,它继承自AbstractQueuedSynchronizer
(AQS)。Sync
通过AQS的state
字段表示锁的状态,其中高16位表示读锁的数量,低16位表示写锁的重入次数。
abstract static class Sync extends AbstractQueuedSynchronizer {
private static final long serialVersionUID = 6317671515068378041L;
static final int SHARED_SHIFT = 16; // 读锁的偏移量
static final int SHARED_UNIT = (1 << SHARED_SHIFT); // 读锁的单位
static final int MAX_COUNT = (1 << SHARED_SHIFT) - 1; // 最大读锁数量
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; } // 获取写锁的重入次数
// 省略其他方法
}
Sync
类通过AQS的state
字段表示锁的状态,高16位表示读锁的数量,低16位表示写锁的重入次数。Sync
类有两个子类NonfairSync
和FairSync
,分别表示非公平锁和公平锁。
核心方法分析
构造方法
ReentrantReadWriteLock
提供了两个构造方法,用于初始化公平性。
无参构造方法
默认使用非公平锁。
public ReentrantReadWriteLock() {