既然大家看到了这篇博客,也应该都大概了解了读写锁的一些概念,咱们直接上主题,读写锁中为什么要用锁降级;

先引用书上的一段话说说锁降级的概念:
        锁降级指的是写锁降级成为读锁。如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种分段完成的过程不能称之为锁降级。锁降级是指线程先持有写锁,再获取到读锁,随后释放(先前拥有的)写锁的过程;

锁降级的必要性1:

锁降级中读锁的获取是否必要呢?答案是必要的。主要是为了保证数据的可见性,如果当前线程不获取读锁而是直接释放写锁, 假设此刻另一个线程(记作线程T)获取了写锁并修改了数据,那么当前线程无法感知线程T的数据更新。如果当前线程获取读锁,即遵循锁降级的步骤,则线程T将会被阻塞,直到当前线程使用数据并释放读锁之后,线程T才能获取写锁进行数据更新。

部分人读完上述话可能有些疑惑,针对上面黑体字那句话,为什么无法感知线程T的数据更新?我当前线程再次获取读锁的时候不是可以察觉到数据在主存中的变化吗? 我参考了一些资料,对该 “”数据可见性“” 有了另一种理解,理解是 当前线程为了保证数据的可见性,这是指线程自己更改了数据,自己应该要察觉到数据的变化,如果没有读锁,更改完数据之后线程T获取到了写锁并更改了数据,则当前线程读到的数据是线程T更改的,并不是自己更改的,当前线程并不知道是线程T修改了自己要读的(原来自己改的)数据,所以可能导致当前线程在执行后续代码的时候结果出错,这时就导致了数据的不可见,即当前线程并无法察觉到自己修改的值!

锁降级的必要性2:
为了提高程序执行性能,可能存在一个事务线程不希望自己的操作被别的线程中断,而这个事务操作可能分成多部分操作更新不同的数据(或表)甚至非常耗时。如果长时间用写锁独占,显然对于某些高响应的应用是不允许的,所以在完成部分写操作后,退而使用读锁降级,来允许响应其他进程的读操作。只有当全部事务完成后才真正释放锁。

JAVA 读写锁中锁降级的必要性相关推荐

  1. java读写锁降级_java的读写锁中锁降级的问题

    读写锁是什么我就不多说了,下面说什么是锁降级 锁降级: 锁降级指的是写锁降级成为读锁.如果当前线程拥有写锁,然后将其释放,最后再获取读锁,这种分段完成的过程不能称之为锁降级.锁降级是指把持住(当前拥有 ...

  2. 图文深入解析 JAVA 读写锁,为什么读锁套写锁会死锁,反过来却不会?

    一.回顾基本的读写锁 我们知道读写锁 #java.util.concurrent.locks.ReentrantReadWriteLock 是一个 "读写互斥,写写互斥,读读共享" ...

  3. StampedLock 读写锁中的最强王者

    StampedLock 简介 我们前面介绍了 ReentrantReadWriteLock可重入读写锁详解,不过 jdk1.8 引入了性能更好的 StampedLock 读写锁,我愿称之为最强! 一种 ...

  4. 自旋锁/互斥锁/读写锁/递归锁的区别与联系

    自旋锁 互斥锁 读写锁 递归锁 互斥锁(mutexlock): 最常使用于线程同步的锁:标记用来保证在任一时刻,只能有一个线程访问该对象,同一线程多次加锁操作会造成死锁:临界区和互斥量都可用来实现此锁 ...

  5. java 读写锁_Java中的读写锁

    一.读写锁 1.初识读写锁 a)Java中的锁--Lock和synchronized中介绍的ReentrantLock和synchronized基本上都是排它锁,意味着这些锁在同一时刻只允许一个线程进 ...

  6. Java并发- 读写锁中的性能之王:StampedLock

    为什么StampedLock这么神奇?能够达到这种效果,它的核心思想在于,在读的时候如果发生了写,应该通过重试的方式来获取新的值,而不应该阻塞写操作.这种模式也就是典型的无锁编程思想,和CAS自旋的思 ...

  7. java读写锁死锁例子_Java并发关于重入锁与读写锁的详解

    这篇文章主要介绍了Java并发编程之重入锁与读写锁,文中相关实例代码详细,测试可用,具有一定参考价值,需要的朋友可以了解下. 重入锁 重入锁,顾名思义,就是支持重进入的锁,它表示该锁能够支持一个线程对 ...

  8. Java 读写锁实现原理

    2019独角兽企业重金招聘Python工程师标准>>> 最近做的一个小项目中有这样的需求:整个项目有一份config.json保存着项目的一些配置,是存储在本地文件的一个资源,并且应 ...

  9. java车次信息_从火车站车次公示栏来学Java读写锁

    Java多线程并发之读写锁 本文主要内容:读写锁的理论:通过生活中例子来理解读写锁:读写锁的代码演示:读写锁总结.通过理论(总结)-例子-代码-然后再次总结,这四个步骤来让大家对读写锁的深刻理解. 本 ...

最新文章

  1. Windbg调试中遇到的问题
  2. Java 序列化之 Externalizable
  3. easyui前端实现多选框_EasyUI实现下拉框多选功能
  4. 【面试题】 做了一份前端面试复习计划,保熟~
  5. 银行排队管理系统(C++实现)
  6. 赚大钱,你需要多一些杠杆思维
  7. 渗透测试-SQL注入之宽字节注入
  8. 普适计算-2014/02/28
  9. 教你如何做好微信客户管理?做到这3点,效率翻5倍
  10. j2me游戏开发之LWJGL(Lightweight Java Game Library)
  11. 使用KCP 加速游戏消息,让全球玩家流畅联网
  12. 【VSCode】提升效率
  13. 【5G安全系列】AS层PDCP完整性保护与加密流程
  14. C++题目及答案(16)——小小课代表
  15. 缩略图方式下, 资源管理器,不能显示文件名
  16. 三种数字调制的形式:ASK PSK FSK
  17. Android 实验室
  18. 结合实际聊聊防反接电路(防反接电路总结)
  19. 真来了!工信部将成立安卓统一推送联盟
  20. ArcGIS中的归一化处理(normalized)

热门文章

  1. 如何预防企业内部数据泄密事件
  2. 数据库常见面试题都给你准备好了
  3. 超出ipc连接数范围_超出了最大允许连接数|数据库超出最大连接数|2003超出最大连接数...
  4. 关于*.7z.001,*.7z.002,...解压问题
  5. NVIDIA主控接入USB摄像头
  6. BZOJ1829 : [Usaco2010 Mar]starc星际争霸
  7. 免费超大量邮件发送服务,Kewail提供SMTP和API支持
  8. JDK与JRE的安装与配置
  9. 转【重磅干货整理】机器学习(Machine Learning)与深度学习(Deep Learning)资料汇总
  10. 梦魇java_梦魇不会连续两次运行 - NodeJS