JVM 对 Java 的原生锁做了哪些优化?
在 Java 6 之前,Monitor 的实现完全依赖底层操作系统的互斥锁来实现。由于 Java 层面的线程与操作系统的原生线程有映射关系,如果要将一个线程进行阻塞或唤起都需要操作系统的协助,这就需要从用户态切换到内核态来执行,这种切换代价十分昂贵,很耗处理器时间,现代 JDK 中做了大量的优化。 一种优化是使用自旋锁,即在把线程进行阻塞操作之前先让线程自旋等待一段时间,可能在等待期间其他线程已经解锁,这时就无需再让线程执行阻塞操作,避免了用户态到内核态的切换。 现代 JDK 中还提供了三种不同的 Monitor 实现,也就是三种不同的锁:
偏向锁(Biased Locking)
轻量级锁
重量级锁
这三种锁使得 JDK 得以优化 Synchronized 的运行,当 JVM 检测到不同的竞争状况时,会自动切换到适合的锁实现,这就是锁的升级、降级。
当没有竞争出现时,默认会使用偏向锁。
JVM 会利用 CAS 操作,在对象头上的 Mark Word 部分设置线程 ID,以表示这个对象偏向于当前线程,所以并不涉及真正的互斥锁,因为在很多应用场景中,大部分对象生命周期中最多会被一个线程锁定,使用偏斜锁可以降低无竞争开销。
如果有另一线程试图锁定某个被偏斜过的对象,JVM 就撤销偏斜锁,切换到轻量级锁实现。
轻量级锁依赖 CAS 操作 Mark Word 来试图获取锁,如果重试成功,就使用普通的轻量级锁;否则,进一步升级为重量级锁
JVM 对 Java 的原生锁做了哪些优化?相关推荐
- Java架构直通车——锁分段技术:微信如何扛住 10 亿用户同时修改微信号?
文章目录 引入 从HashMap到ConcurrentHashMap的转变:理解锁分段技术 HashMap的死循环 ConcurrentHashMap的实现方式---锁桶(或段) Concurrent ...
- JVM笔记 - Java 虚拟机关于 Synchronized 实现以及锁实现的总结
本文是我在阅读 <深入理解Java虚拟机-第三版>和 极客时间 郑宇迪对于JVM的剖析后做的总结,如有不妥,不明白的地方,欢迎斧正 下面是一张比较经典的 Java 虚拟机锁实现流程图,不了 ...
- Java 虚拟机对锁优化所做的努力
转载自 Java 虚拟机对锁优化所做的努力 作为一款公用平台,JDK 本身也为并发程序的性能绞尽脑汁,在 JDK 内部也想尽一切办法提供并发时的系统吞吐量.这里,我将向大家简单介绍几种 JDK 内 ...
- Java多线程学习十九:JVM 对锁进行了哪些优化?
JVM 对锁进行了哪些优化呢? 相比于 JDK 1.5,在 JDK 1.6 中 HotSopt 虚拟机对 synchronized 内置锁的性能进行了很多优化,包括自适应的自旋.锁消除.锁粗化.偏向锁 ...
- java多线程之锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁
转载至:https://blog.csdn.net/zqz_zqz/article/details/70233767 之前做过一个测试,详情见这篇文章<多线程 +1操作的几种实现方式,及效率对比 ...
- 深入理解多线程(五)—— Java虚拟机的锁优化技术
本文是<深入理解多线程>的第五篇文章,前面几篇文章中我们从synchronized的实现原理开始,一直介绍到了Monitor的实现原理. 前情提要 通过前面几篇文章,我们已经知道: 1.同 ...
- java线程池 锁_java多线程——锁
这是多线程系列第四篇,其他请关注以下: 如果你看过前面几篇关于线程的文字,会对线程的实现原理了然于胸,有了理论的支持会对实践有更好的指导,那么本篇会偏重于线程的实践,对线程的几种应用做个简要的介绍. ...
- Java虚拟机(JVM)与Java内存模型(JMM)学习笔记
Java虚拟机[JVM]与Java内存模型[JMM]学习笔记 Java虚拟机(JVM) 三种JVM JVM 位置 JVM的主要组成部分及其作用 类加载器 双亲委派机制 沙箱安全机制 Java本地接口( ...
- 深入理解JVM之Java内存区域与内存溢出异常
读了<深入理解Java虚拟机-JVM高级特性与最佳实践>的第二章,明白了在虚拟机中内存是如何划分的,哪部分区域.什么样的代码和操作可能导致内存溢出异常.虽然Java有垃圾收集机制,但是内存 ...
最新文章
- Swift 3.0 预告:将 Objc 库转换成更符合 Swift 语法风格的形式
- L1-009 N个数求和
- winhttp get 实例_实例|CASS的绘制的航道断面,怎么多了两个边沟? 135
- Zabbix Python API 应用实战
- 【Linux - mysql】linux下mysql报Failed to restart mysqld.service: Unit not found
- weblogic运行项目_在WebLogic 12c上运行RichFaces
- 360Alluxio联合Meetup——分布式存储与Alluxio应用实践
- *2.3.2_加入env
- C# winform以阅览模式打开PPT,并控制PPT上下页,轮播
- Mysql 基于 Amoeba 的 读写分离
- django数据库处理
- 什么是我想要守护的东西?
- Python核心编程第三版
- c语言函数.pdf文档,c语言库函数表.pdf
- 概率论——几何随机变量
- vue实现点击复制文本
- AOJ-AHU-OJ-401 Fibonacci GCD
- 博弈论基础知识: 巴什博奕+斐波那契博弈+威佐夫博奕+尼姆博弈(及Staircase)
- Extreme DAX中文第1章 商业智能中的DAX
- 全自动调节灯光强度的实现(仿真+程序+文档)