ReentrantReadWriteLock中的锁降级

Posted therhyme

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ReentrantReadWriteLock中的锁降级相关的知识,希望对你有一定的参考价值。

锁降级指的是锁降级为锁。

因为读锁与读锁之间不互斥,如果是写锁与读锁或者是写锁与写锁就会互斥,所以由写锁变为读锁就降级了。

如果当前线程拥有锁,然后将其释放,最后获取读锁,这种并能称之为锁降级。

锁降级指的是把持住(当前拥有的)写锁获取到读锁,随后释放(先前有用的)写锁的过程。

下面给出一个锁降级的示例,当数据变动时,isUpdate变量被设置为false,此时所有所有readwrite()方法的线程都能感知到变化,但是只有一个线程能够获取到写锁,其他线程会被阻塞读锁和写锁的lock()方法上;当前线程获取写锁完成数据准备之后,再获取读锁,随后释放写锁,完成锁降级

 

为了保证数据的可见性,如果当前线程不获取读锁而是直接释放写锁,假设此时有另一个线程T获取了写锁并修改了数据,那么当前线程无法感知线程T的数据更新;但是如果当前线程获取读锁,则线程T会被阻塞,直到当前线程使用数据并施放读锁之后,线程T才能获取写锁进行数据更新。

 

用下面的代码来解释,在注释2和注释6上并不加读锁的获取和释放(即//2和//6被注释掉),当前线程完成注释1的put操作后,进行注释3的写锁释放操作,若此时有另一个线程获得写锁并进行修改(即进行注释1操作),那么当前获得读锁的线程无法感知,在进行注释4和注释5操作时就会发生线程安全性问题。

若加上注释2和注释6,由于锁和锁之间是互斥的,当写锁释放的时候,由于注释2读锁的存在,新的线程并不能获得写锁,此时就保证了线程安全性

技术图片

 

 

 

来源:https://blog.csdn.net/u010512429/article/details/80011239

以上是关于ReentrantReadWriteLock中的锁降级的主要内容,如果未能解决你的问题,请参考以下文章

java中ReentrantReadWriteLock读写锁的使用

JUC包中的锁框架

Java中的锁机制

7.ReadWriteLock接口及其实现ReentrantReadWriteLock

Java中常用的锁分析总结

Java中常用的锁分析总结