Java ReentrantLock读写锁源码深度剖析

需积分: 5 0 下载量 29 浏览量 更新于2024-08-05 收藏 10KB TXT 举报
Java中的`ReentrantReadWriteLock`是一种高级的互斥锁实现,它允许多个线程同时读取共享数据,但仅允许一个线程进行写操作,以提高并发性能。该锁的设计灵感来源于`ReentrantLock`,但在读写权限管理上有所不同。它的内部结构主要包括同步控制子类(如`Sync`, `FairSync`, 和 `NonfairSync`),这些子类继承自`AbstractQueuedSynchronizer`(AQS),它是所有可重入锁的基类。 核心部分,`Sync`类定义了状态变量`state`,继承自`AQS`的`int`类型,用于跟踪锁的状态。`Thread.firstReader`和`firstReaderHoldCount`分别表示首个获得读锁的线程和该线程的重入计数。读锁的获取通过`acquireShared(1)`方法进行,写锁则通过`acquire(1)`获取。 对于公平锁定(`FairSync`),读锁的`lock()`方法会调用`sync.acquireShared(1)`,尝试加锁的过程分为两个步骤: 1. `tryAcquireShared(int unused)`:这是一个尝试性获取共享锁的方法,它首先检查当前线程是否已经在持有写锁,如果有,直接返回-1表示无法获取。如果线程没有写锁,或者当前线程已经拥有写锁(即重入),则继续尝试加锁。公平模式下,线程会按照申请顺序等待,直到前面的线程释放读锁。 2. `doAcquireShared(int arg)`:如果`tryAcquireShared`返回小于0(失败),则执行这个方法,可能涉及阻塞等待,直到满足获取条件。 写锁的获取更为严格,因为只允许一个线程独占,通过`acquire(1)`调用,同样先尝试加锁,`tryAcquire()`方法会检查是否有其他线程正在写,如果有,同样返回-1。 `EXCLUSIVE_MASK`是一个常量,用于设置读锁和写锁之间的位运算,区分两者。`SHARED_SHIFT`和`SHARED_UNIT`则是与读写锁的计数相关的偏移量和单位,用于计算共享锁的数量。 在实际使用中,`ReentrantReadWriteLock`提供了更多的灵活性,例如`readLock()`和`writeLock()`方法用于获取读锁和写锁,以及`newCondition()`方法创建条件变量以实现更复杂的同步逻辑。理解这个源码有助于开发者优化多线程环境下的数据访问,提高并发性能,同时确保数据的一致性和完整性。