zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    Hbase调用JavaAPI实现批量导入操作
    spring-quartz定时任务使用小结
    Cocos2d-x JSB 自己主动绑定bindings
    CentOS 6.x安装多GCC版本号,cmake的安装与使用
    PPAPI+Skia实现的涂鸦板
    UVA
    [ExtJS5学习笔记]第三十四节 sencha extjs 5 grid表格之java后台导出excel
    文本分析之中文分词
    cocos2d-x创建精灵动画
    美国L1签证申请的常见问题解析
  • 原文地址:https://www.cnblogs.com/theRhyme/p/9543140.html
Copyright © 2011-2022 走看看