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源码解析】 ReentrantReadWriteLock是Java并发包中的一个核心类,它提供了读写锁的实现,使得多个线程可以并发读取共享资源,但写操作是互斥的,即同一时间只能有一个线程进行写...
- `ReentrantReadWriteLock`是可重入的,意味着一个线程可以多次获取同一类型的锁(读或写),只要它能正确释放。 - 它提供了`ReadLock`和`WriteLock`接口,分别代表读锁和写锁,可以通过`lock()`和`unlock()`方法...
Java的`ReentrantReadWriteLock`提供了可重入的读写锁功能,包括`ReadLock`和`WriteLock`接口,它们分别用于读取和写入操作。开发者可以通过调用`lock()`和`unlock()`方法来获取和释放锁。 6. **C++中的std::...
- `ReentrantReadWriteLock`是Java提供的可重入的读写锁实现,它继承自`AbstractQueuedSynchronizer`(AQS)。可重入意味着一个线程可以多次获取同一锁,这在递归调用或者锁嵌套时很有用。 - **公平性**:`...
典型的Lock实现如ReentrantLock,它支持公平锁和非公平锁,以及可重入和可中断的特性。 五、ReadWriteLock接口的设计与实现 ReadWriteLock接口代表读写锁,它允许多个读取者同时访问资源,但在写入时确保互斥。典型...
3. **ReentrantReadWriteLock(读写锁)**: - **设计思想**:允许多个读取者同时访问,但只有一个写入者,提高并发性能。 - **实现**:基于AQS封装的Sync抽象类,分为读锁ReadLock和写锁WriteLock,读写锁的状态...
2. **锁机制**:JUC提供了显式锁ReentrantLock,它比synchronized更灵活,支持公平锁和非公平锁,以及可中断和可重入的特性。此外,还有读写锁ReentrantReadWriteLock,允许多个读取者同时访问,但只允许一个写入者...
9. **锁的高级特性**:包括读写锁(ReentrantReadWriteLock)、乐观锁(StampedLock)以及锁的可重入性、公平性和非公平性等概念。 10. **源码分析**:通过对JUC库中部分关键类的源码分析,帮助学员深入理解并发...
细读ReentrantReadWriteLock源码.mp4 ReentrantReadWriteLock锁降级详解.mp4 线程安全性问题简单总结.mp4 线程之间的通信之wait notify.mp4 通过生产者消费者模型理解等待唤醒机制.mp4 Condition的使用及原理解析....
11.深入理解读写锁ReentrantReadWriteLock 12.详解Condition的await和signal等待通知机制 13.LockSupport工具 14.并发容器之ConcurrentHashMap(JDK 1.8版本) 15.并发容器之ConcurrentLinkedQueue 16.并发容器之...
`ReentrantLock`是一种可重入的互斥锁,支持公平和非公平两种模式。它内部有一个`Sync`类,继承自`AbstractQueuedSynchronizer`,并且有两个子类分别实现了公平和非公平锁的逻辑。 - **非公平锁** (`NonfairSync`):...
- **Lock接口与ReentrantLock**:提供更细粒度的锁控制,如可重入锁、公平锁、非公平锁、读写锁等。 - **volatile**:确保变量的可见性,防止指令重排序,但不保证原子性。 3. **并发工具类** - **Executor框架*...
3. **数据操作**: 分析读写 ZooKeeper 节点数据的源码,了解 zkclient 如何封装和优化这些操作。 4. **并发控制**: zkclient 在多线程环境下的同步和并发控制策略,如使用 ReentrantReadWriteLock 和 Semaphore。 ...
6. ReentrantLock和ReentrantReadWriteLock:ReentrantLock是可重入锁,允许多次进入同一线程,保证了线程安全。ReentrantReadWriteLock是读写锁,允许多个读线程同时访问,但写线程独占资源,提高了并发性能。 7. ...
4. **读写锁模式**:`ReentrantReadWriteLock`是Java提供的读写锁,它允许多个读取线程同时访问共享资源,但在写操作时则独占资源。这在读多写少的场景下可以提高并发性能。读写锁比传统的互斥锁更细粒度,可以减少...
4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...
4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...
4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...
4-10 深入剖析ReentrantReadWriteLock之读锁源码实现.mp4 4-11 深入剖析ReentrantReadWriteLock之写锁源码实现.mp4 4-12 锁降级详解.mp4 4-13 StampedLock原理及使用.mp4 5-1 wait、notify、notifyAll.mp4 5-2 ...