• 微信公众号:美女很有趣。 工作之余,放松一下,关注即送10G+美女照片!

ReentrantReadWriteLock 读写锁

开发技术 开发技术 6小时前 2次浏览

  ReentrantLock 中还有 ReentrantReadWriteLock 这么一个变种,读读不互斥,读写互斥,写写互斥。

ReentrantReadWriteLock 读写锁

加写锁

  一开始,就是 tryAcquire 获取锁,如果获取失败就返回 false ,那就走 addWaiter 将请求入队,然后 acquireQueued 挂起线程。和 ReentrantLock 一毛一样,那我们就来分析分析它的这个 加锁逻辑有何不同吧。

第一次线程过来
1. 首先获取到当前线程,state (默认肯定是为0的),w(state 的低16位,高16位是标识读锁的 )
2. c != 0 那就说明被人加过锁了,我们现在是第一次进来,那么肯定不走这里,先跳过。
3. writerShouldBlock() 没任何逻辑,直接返回false了
4. 然后就是 cas 加锁,成功了就返回false,标记线程锁占用标识。

第 N 次线程过来
1. 首先获取到当前线程,state (假设被人加锁了,那么就是1),w(state 的低16位,写锁标识 )
2. c != 0 那就说明被人加过锁了,进来这个分支。
3. w == 0 ,说明之前加的是读锁,或者 不是当前线程,那就加锁失败返回false
4. 能走到下面的 if ,就说明 之前是当前线程家的写锁,那么 state+1就完了。
5. 最后走到 setExclusiveOwnerThread 设置线程占据锁标识

所以说 写锁 和 读/写锁 都是互斥的压根进不来。所谓的读写锁就是靠 state 的高低16位来搞的。

ReentrantReadWriteLock 读写锁

释放锁就没啥说的了,state-1,占用锁线程置空,然后唤醒头部节点。

加读锁

 

释放读锁

 

 。


程序员灯塔
转载请注明原文链接:ReentrantReadWriteLock 读写锁
喜欢 (0)