【ReentrantReadWriteLock的实现原理】

简介: 【ReentrantReadWriteLock的实现原理】

ReentrantReadWriteLock是Java中的一种可重入读写锁,用于控制对共享资源的并发访问。相比于普通的锁,读写锁允许多个线程同时读取共享资源,但只允许一个线程写入共享资源。ReentrantReadWriteLock实现了读写锁的基本功能,并提供了更丰富的特性,比如可重入性、公平性等。

下面来详细介绍ReentrantReadWriteLock的实现原理。

内部数据结构

ReentrantReadWriteLock使用了一个内部类Sync来实现锁的功能,Sync继承自AQS(AbstractQueuedSynchronizer)类,AQS是Java中锁的基础类,提供了锁的通用实现方式。Sync中维护了一个sharedCount变量,用于记录当前有多少个线程正在读取共享资源,同时还维护了一个exclusivelyOwnerThread变量,用于记录当前独占锁的线程。

读锁实现

当一个线程请求读锁时,Sync首先会判断是否有线程持有独占锁,如果有,则当前线程需要进行等待,否则当前线程可以继续获取读锁。Sync维护了一个共享锁计数器sharedCount,当一个线程获取到读锁时,将sharedCount加1。当一个线程释放读锁时,将sharedCount减1。当所有的读锁都被释放后,就可以允许一个写锁获取器独占锁。

写锁实现

当一个线程请求写锁时,Sync首先会尝试获取独占锁,如果获取成功,则当前线程可以继续获取写锁,否则当前线程需要进行等待。当一个线程获取到写锁时,Sync会将exclusivelyOwnerThread设置为当前线程,用于记录当前独占锁的线程。当一个线程释放写锁时,Sync会将exclusivelyOwnerThread重置为null,表示当前没有线程持有独占锁。同时,Sync会唤醒等待队列中的线程,让它们尝试获取锁。

可重入性

ReentrantReadWriteLock支持可重入性,允许同一个线程重复获取锁。当一个线程首次获取锁时,Sync会记录当前线程以及获取次数,当该线程再次获取锁时,Sync会比较当前线程和已记录的线程,如果是同一个线程,则增加获取次数,否则不允许获取锁。

公平锁

ReentrantReadWriteLock支持公平锁和非公平锁。在公平模式下,线程会按照先后顺序排队获取锁,所有线程的获取顺序是公平的。在非公平模式下,线程可以插队获取锁,有可能导致某些线程一直无法获取锁。默认情况下,ReentrantReadWriteLock使用非公平锁。

综上所述,ReentrantReadWriteLock通过Sync内部类实现了锁的功能,支持可重入性、公平性等特性,是Java中实现读写锁的一种有效方式。


相关文章
|
21天前
|
存储 监控 安全
Synchronized 实现原理
Synchronized 实现原理
43 0
|
21天前
|
安全 Java
Java并发编程:Synchronized及其实现原理
Java并发编程:Synchronized及其实现原理
26 4
|
7月前
|
Java API
StampedLock源码分析(1)
之前已经说过了ReentrantLock ReentrantReadWriteLock,可以参考之前的博客。在ReentrantReadWriteLock源码解析文末,我提到了ReentrantReadWriteLock的缺点,就是无法避免写线程饥渴的问题,而今天要说的StampedLock提供了乐观读的API,解决了写饥渴的问题。
25 0
|
21天前
|
安全 Java 测试技术
ReentrantReadWriteLock(可重入读写锁)源码解读与使用
ReentrantReadWriteLock(可重入读写锁)源码解读与使用
|
21天前
|
安全 Java
ReentrantLock 原理你都知道吗?
通过以上步骤和示例代码,你应该对 ReentrantLock 的工作原理有了清晰的理解。欢迎关注威哥爱编程,一起学习成长。
ReentrantReadWriteLock源码分析
ReentrantReadWriteLock源码分析
|
12月前
|
Java API 调度
synchronized 和 ReentrantLock 的实现原理是什么?它们有什么区别
synchronized 和 ReentrantLock 的实现原理是什么?它们有什么区别
62 0
|
Java API
图解ReentrantReadWriteLock读写锁的实现原理(上)
图解ReentrantReadWriteLock读写锁的实现原理
155 0
图解ReentrantReadWriteLock读写锁的实现原理(上)
图解ReentrantReadWriteLock读写锁的实现原理(下)
图解ReentrantReadWriteLock读写锁的实现原理
104 0
图解ReentrantReadWriteLock读写锁的实现原理(下)
|
设计模式 Java API
StampedLock源码分析
StampedLock源码分析
71 0
StampedLock源码分析

热门文章

最新文章