ReentrantReadWriteLock中的锁降级

时间:2019-08-27
本文章向大家介绍ReentrantReadWriteLock中的锁降级,主要包括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

原文地址:https://www.cnblogs.com/theRhyme/p/9543140.html