在 Java 6 之前,Monitor 的实现完全依赖底层操作系统的互斥锁来实现。由于 Java 层面的线程与操作系统的原生线程有映射关系,如果要将一个线程进行阻塞或唤起都需要操作系统的协助,这就需要从用户态切换到内核态来执行,这种切换代价十分昂贵,很耗处理器时间,现代 JDK 中做了大量的优化。 一种优化是使用自旋锁,即在把线程进行阻塞操作之前先让线程自旋等待一段时间,可能在等待期间其他线程已经解锁,这时就无需再让线程执行阻塞操作,避免了用户态到内核态的切换。 现代 JDK 中还提供了三种不同的 Monitor 实现,也就是三种不同的锁:

 偏向锁(Biased Locking)

 轻量级锁

 重量级锁

这三种锁使得 JDK 得以优化 Synchronized 的运行,当 JVM 检测到不同的竞争状况时,会自动切换到适合的锁实现,这就是锁的升级、降级。

 当没有竞争出现时,默认会使用偏向锁。

JVM 会利用 CAS 操作,在对象头上的 Mark Word 部分设置线程 ID,以表示这个对象偏向于当前线程,所以并不涉及真正的互斥锁,因为在很多应用场景中,大部分对象生命周期中最多会被一个线程锁定,使用偏斜锁可以降低无竞争开销。

 如果有另一线程试图锁定某个被偏斜过的对象,JVM 就撤销偏斜锁,切换到轻量级锁实现。

 轻量级锁依赖 CAS 操作 Mark Word 来试图获取锁,如果重试成功,就使用普通的轻量级锁;否则,进一步升级为重量级锁

JVM 对 Java 的原生锁做了哪些优化?相关推荐

  1. Java架构直通车——锁分段技术:微信如何扛住 10 亿用户同时修改微信号?

    文章目录 引入 从HashMap到ConcurrentHashMap的转变:理解锁分段技术 HashMap的死循环 ConcurrentHashMap的实现方式---锁桶(或段) Concurrent ...

  2. JVM笔记 - Java 虚拟机关于 Synchronized 实现以及锁实现的总结

    本文是我在阅读 <深入理解Java虚拟机-第三版>和 极客时间 郑宇迪对于JVM的剖析后做的总结,如有不妥,不明白的地方,欢迎斧正 下面是一张比较经典的 Java 虚拟机锁实现流程图,不了 ...

  3. Java 虚拟机对锁优化所做的努力

    转载自   Java 虚拟机对锁优化所做的努力 作为一款公用平台,JDK 本身也为并发程序的性能绞尽脑汁,在 JDK 内部也想尽一切办法提供并发时的系统吞吐量.这里,我将向大家简单介绍几种 JDK 内 ...

  4. Java多线程学习十九:JVM 对锁进行了哪些优化?

    JVM 对锁进行了哪些优化呢? 相比于 JDK 1.5,在 JDK 1.6 中 HotSopt 虚拟机对 synchronized 内置锁的性能进行了很多优化,包括自适应的自旋.锁消除.锁粗化.偏向锁 ...

  5. java多线程之锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

    转载至:https://blog.csdn.net/zqz_zqz/article/details/70233767 之前做过一个测试,详情见这篇文章<多线程 +1操作的几种实现方式,及效率对比 ...

  6. 深入理解多线程(五)—— Java虚拟机的锁优化技术

    本文是<深入理解多线程>的第五篇文章,前面几篇文章中我们从synchronized的实现原理开始,一直介绍到了Monitor的实现原理. 前情提要 通过前面几篇文章,我们已经知道: 1.同 ...

  7. java线程池 锁_java多线程——锁

    这是多线程系列第四篇,其他请关注以下: 如果你看过前面几篇关于线程的文字,会对线程的实现原理了然于胸,有了理论的支持会对实践有更好的指导,那么本篇会偏重于线程的实践,对线程的几种应用做个简要的介绍. ...

  8. Java虚拟机(JVM)与Java内存模型(JMM)学习笔记

    Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...

  9. 深入理解JVM之Java内存区域与内存溢出异常

    读了<深入理解Java虚拟机-JVM高级特性与最佳实践>的第二章,明白了在虚拟机中内存是如何划分的,哪部分区域.什么样的代码和操作可能导致内存溢出异常.虽然Java有垃圾收集机制,但是内存 ...

最新文章

  1. Swift 3.0 预告:将 Objc 库转换成更符合 Swift 语法风格的形式
  2. L1-009 N个数求和
  3. winhttp get 实例_实例|CASS的绘制的航道断面,怎么多了两个边沟? 135
  4. Zabbix Python API 应用实战
  5. 【Linux - mysql】linux下mysql报Failed to restart mysqld.service: Unit not found
  6. weblogic运行项目_在WebLogic 12c上运行RichFaces
  7. 360Alluxio联合Meetup——分布式存储与Alluxio应用实践
  8. *2.3.2_加入env
  9. C# winform以阅览模式打开PPT,并控制PPT上下页,轮播
  10. Mysql 基于 Amoeba 的 读写分离
  11. django数据库处理
  12. 什么是我想要守护的东西?
  13. Python核心编程第三版
  14. c语言函数.pdf文档,c语言库函数表.pdf
  15. 概率论——几何随机变量
  16. vue实现点击复制文本
  17. AOJ-AHU-OJ-401 Fibonacci GCD
  18. 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)
  19. Extreme DAX中文第1章 商业智能中的DAX
  20. 全自动调节灯光强度的实现(仿真+程序+文档)

热门文章

  1. [渝粤教育] 天津师范大学 基础心理学 参考 资料
  2. 知觉:看到什么就是什么
  3. JCMsuite应用:光学环形谐振腔模拟
  4. html来自网页的消息,win7系统ie浏览器提示:来自网页的消息的解决方法
  5. raid5常见故障数据恢复方法/服务器数据恢复常用方法
  6. 实习------Java基础2
  7. set IDENTITY_INSERT on 和 off 的设置
  8. Nginx的Https配置及代理api接口配置
  9. 威睿数据中心虚拟化解决方案
  10. JS javascript 睡眠