`
xussen
  • 浏览: 31732 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

重入读写锁(ReentrantReadWriteLock)源码

阅读更多
tryAcquireShared
exclusiveCount(state)!=0&&getExclusiveOwnerThread!=current//如果现在是写锁状态,并且当前线程不是拥有锁的线程
也就是如果是当前线程是拥有写锁的,读操作也可以进去
if(!readShouldBlock(current)&&CAS(state, state+SHARED_UNIT)){
     cacheHoldCounter.count++     //重入计数
     return 1;
}
return -1;


tryAcquire
if(state!=0) {
     if(exclusiveCount==0||current != getExclusiveOwnerThread)//因为状态大于0,但如果写的部分为零,说明只有读锁,那么写锁肯定进不去。
     return false;
}
if(writeShouldBlock(current)||!CAS(c,c+acquires)) {
     return false;
}
setExclusiveOwnerThread(current)
return ture


释放独占锁
nextc = state-release
if(exclusiveCount(nextc)==0) {     //判断低四位的值是否为0,表示写锁重入的次数
     setExclusiveOwnerThread(null)
     setState(nextc)
     return true
} else {                                      //表示还有部分锁的重入没解开,所以返回false,不让AQS去唤醒后面的节点
     setState(nextc)
     return false
}
如果为true 将会执行
unparkSuccessor(h)

释放共享锁
if(cacheHoldCounter.tryDecrement()<=0) throw new IllegalMonitorStateException     //用holdCounter表示重入次数
for(;;) {
     if(CAS(state, state-SHARE_UNIT))               //state高四位减去一
          return nextc==0                                   //如果不等于0表示还有部分锁的重入没解开,返回false,不让AQS去唤醒后面的节点
}
如果为true,将会执行
doReleaseShared()

FairSync
readerShouldBlock(current)//判断current != head.next.thread
NonfairSync
readerShouldBlock(current)//判断head.next.nextWaiter != Node.SHARED

总结:ReentrantReadWriteLock比较有意思的几个地方
1、queue里面两种节点:独占和共享。独占节点唤醒之后,会移除当前节点并继续执行;共享节点唤醒之后,会移除当前节点并扩散后面的共享节点
2、对state的巧妙设计,高四位用来表示读锁状态,低四位表示写锁状态。
3、对某个线程读锁的重入,用AQS现有的结果无法满足,所以就依靠了ThreadLocal来保存某个线程对某个锁的持有情况和重入数量。
互斥锁是可以用一个state变量来表示锁的重入情况,因为只对应一个线程,完全可以在获取和释放前做current==getExclusiveOwnerThread来判断
分享到:
评论

相关推荐

    深入浅出ReentrantReadWriteLock源码解析.docx

    【深入浅出ReentrantReadWriteLock源码解析】 ReentrantReadWriteLock是Java并发包中的一个核心类,它提供了读写锁的实现,使得多个线程可以并发读取共享资源,但写操作是互斥的,即同一时间只能有一个线程进行写...

    java 读写锁代码

    - `ReentrantReadWriteLock`是可重入的,意味着一个线程可以多次获取同一类型的锁(读或写),只要它能正确释放。 - 它提供了`ReadLock`和`WriteLock`接口,分别代表读锁和写锁,可以通过`lock()`和`unlock()`方法...

    计算机软件-商业源码-利用读写锁保持线程同步.zip

    Java的`ReentrantReadWriteLock`提供了可重入的读写锁功能,包括`ReadLock`和`WriteLock`接口,它们分别用于读取和写入操作。开发者可以通过调用`lock()`和`unlock()`方法来获取和释放锁。 6. **C++中的std::...

    homework-ReadWriteLock-KristampsW-main.zip

    - `ReentrantReadWriteLock`是Java提供的可重入的读写锁实现,它继承自`AbstractQueuedSynchronizer`(AQS)。可重入意味着一个线程可以多次获取同一锁,这在递归调用或者锁嵌套时很有用。 - **公平性**:`...

    基于JDK源码解析Java领域中的并发锁之设计与实现.pdf

    典型的Lock实现如ReentrantLock,它支持公平锁和非公平锁,以及可重入和可中断的特性。 五、ReadWriteLock接口的设计与实现 ReadWriteLock接口代表读写锁,它允许多个读取者同时访问资源,但在写入时确保互斥。典型...

    基于JDK源码解析Java领域中的并发锁,我们需要特别关注哪些内容?

    3. **ReentrantReadWriteLock(读写锁)**: - **设计思想**:允许多个读取者同时访问,但只有一个写入者,提高并发性能。 - **实现**:基于AQS封装的Sync抽象类,分为读锁ReadLock和写锁WriteLock,读写锁的状态...

    juc源码视频教程最全

    2. **锁机制**:JUC提供了显式锁ReentrantLock,它比synchronized更灵活,支持公平锁和非公平锁,以及可中断和可重入的特性。此外,还有读写锁ReentrantReadWriteLock,允许多个读取者同时访问,但只允许一个写入者...

    JUC并发编程与源码分析视频课.zip

    9. **锁的高级特性**:包括读写锁(ReentrantReadWriteLock)、乐观锁(StampedLock)以及锁的可重入性、公平性和非公平性等概念。 10. **源码分析**:通过对JUC库中部分关键类的源码分析,帮助学员深入理解并发...

    Java并发编程原理与实战

    细读ReentrantReadWriteLock源码.mp4 ReentrantReadWriteLock锁降级详解.mp4 线程安全性问题简单总结.mp4 线程之间的通信之wait notify.mp4 通过生产者消费者模型理解等待唤醒机制.mp4 Condition的使用及原理解析....

    【2018最新最详细】并发多线程教程

    11.深入理解读写锁ReentrantReadWriteLock 12.详解Condition的await和signal等待通知机制 13.LockSupport工具 14.并发容器之ConcurrentHashMap(JDK 1.8版本) 15.并发容器之ConcurrentLinkedQueue 16.并发容器之...

    Java分布式应用学习笔记06浅谈并发加锁机制分析

    `ReentrantLock`是一种可重入的互斥锁,支持公平和非公平两种模式。它内部有一个`Sync`类,继承自`AbstractQueuedSynchronizer`,并且有两个子类分别实现了公平和非公平锁的逻辑。 - **非公平锁** (`NonfairSync`):...

    java并发编程实战源码,java并发编程实战pdf,Java源码.zip

    - **Lock接口与ReentrantLock**:提供更细粒度的锁控制,如可重入锁、公平锁、非公平锁、读写锁等。 - **volatile**:确保变量的可见性,防止指令重排序,但不保证原子性。 3. **并发工具类** - **Executor框架*...

    zkclient 1.0 源码包

    3. **数据操作**: 分析读写 ZooKeeper 节点数据的源码,了解 zkclient 如何封装和优化这些操作。 4. **并发控制**: zkclient 在多线程环境下的同步和并发控制策略,如使用 ReentrantReadWriteLock 和 Semaphore。 ...

    Java多线程源码笔记.pdf

    6. ReentrantLock和ReentrantReadWriteLock:ReentrantLock是可重入锁,允许多次进入同一线程,保证了线程安全。ReentrantReadWriteLock是读写锁,允许多个读线程同时访问,但写线程独占资源,提高了并发性能。 7. ...

    Java多线程设计模式(带源码)

    4. **读写锁模式**:`ReentrantReadWriteLock`是Java提供的读写锁,它允许多个读取线程同时访问共享资源,但在写操作时则独占资源。这在读多写少的场景下可以提高并发性能。读写锁比传统的互斥锁更细粒度,可以减少...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载4.zip

    4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载2.zip

    4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载3.zip

    4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...

    Java互联网架构多线程并发编程原理及实战 视频教程 下载.zip

    4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...

Global site tag (gtag.js) - Google Analytics