JVM锁优化
1. 概述
JDK1.6版本花费了大量精力去实现各种锁优化,如适应性自旋,锁消除,锁粗化,轻量级锁,偏向锁等,这些技术都是为了在线程期间更高效的共享数据,以及解决竞争问题。
2. 自旋锁与自适应自旋
传统的互斥锁对性能最大的影响是阻塞的实现,线程的挂起和恢复需要转入内核态中完成,相当影响效率。
多线程场景下线程之间通过抢占CPU时间分片进行任务执行,有可能持有锁的线程很快就会释放锁,此时让后面的线程执行一个忙循环进行等待。这就是自旋锁。
自选次数默认为10次,可使用 -XX:PreblockSpin参数来更改。
jdk1.6 加入了自适应自旋锁,这意味着自旋时间不再是固定的,而是由上一次在同一个锁上的自旋时间及锁的拥有者状态来决定。随着JVM的运行,自旋时间的预测也将更加准确。
3. 锁消除
锁消除是指在JVM即时编译器运行时,在对代码进行同步时,对检测到不存在共享数据竞争的锁进行消除。
4. 锁粗化
如果一系列的连续操作都对同一个对象反复加锁和解锁,则将会把同步的范围粗化到整个操作序列的外部,这样只需要加一次锁就行了。
5. 偏向锁
目的:在无竞争的情况下消除整个同步使用的互斥量,连CAS操作都不做了。
定义:偏向锁会偏向第一个获得它的线程,如果在接下来的执行过程中该锁没有被其他线程获取,则持有偏向锁的线程以后进入这个锁相关的同步块不再需要进行同步。
原理:
- 锁对象第一次被获取时,虚拟机会把,即偏向锁模式;
- 同时使用CAS操作将线程ID记录在对象的 Mark World 之中;
- 若CAS操作成功,则以后进入这个锁相关的同步块时不再进行任何同步操作。
当另一个线程尝试获取这个锁时,偏向模式结束。此时根据锁对象是否处于锁定状态,将锁对象恢复到未锁定状态或者轻量级锁状态(锁的升级,单向不可逆)。
6. 轻量级锁
目的:在无竞争的情况下使用CAS操作去消除同步使用的互斥量;
原理:
- 代码进入同步块的时候,若锁对象没有被锁定。
- 虚拟机首先在栈帧中建立一个名为锁记录(Lock Record)的空间,存储锁对象的 Mark World 的拷贝;
- 虚拟机使用CAS操作将对象的 Mark World 更新为指向 Lock Record 的指针;
- 若这个CAS操作成功,则此对象处于轻量级锁定状态;
- 若这个CAS操作失败,则检查对象的 Mark World 是否已经指向当前线程栈帧中的 Lock Record,
- 若已经指向,则表明当前线程拥有该对象的锁,继续执行,否则膨胀为重量级锁。
JVM锁优化的更多相关文章
- 面试官:JVM锁优化都优化了啥?
从JDK1.6开始,JVM对锁进行了各种优化,目的就是为了在线程间更高效的共享数据和解决互斥同步的问题.从锁优化的话题开始,可以引申出很多考点面试题,比如锁优化的技术.各优化技术的细节.CAS实现原理 ...
- JVM锁优化以及区别
偏向所锁,轻量级锁都是乐观锁,重量级锁是悲观锁. 首先简单说下先偏向锁.轻量级锁.重量级锁三者各自的应用场景: 偏向锁:只有一个线程进入临界区: 轻量级锁:多个线程交替进入临界区: 重量级锁:多个线程 ...
- B5. Concurrent JVM 锁优化
[概述] 高效并发是从 JDK1.5 到 JDK 1.6 的一个重要改进,HotSpot 虚拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术,如适应性自旋(Adaptive Spining ...
- JVM中锁优化简介
本文将简单介绍HotSpot虚拟机中用到的锁优化技术. 自旋锁 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力.而在很多 ...
- jvm(13)-线程安全与锁优化(转)
0.1)本文部分文字转自“深入理解jvm”, 旨在学习 线程安全与锁优化 的基础知识: 0.2)本文知识对于理解 java并发编程非常有用,个人觉得,所以我总结的很详细: [1]概述 [2]线程安全 ...
- java源码剖析: 对象内存布局、JVM锁以及优化
一.目录 1.启蒙知识预热:CAS原理+JVM对象头内存存储结构 2.JVM中锁优化:锁粗化.锁消除.偏向锁.轻量级锁.自旋锁. 3.总结:偏向锁.轻量级锁,重量级锁的优缺点. 二.启蒙知识预热 开启 ...
- 【JVM.12】线程安全与锁优化
一.概述 面向过程的编程思想极大地提升了现代软件开发的生产效率和软件可以达到的规模,但是现实世界与计算机世界之间不可避免地存在一些差异,本节就如何保证并发的正确性和如何实现线程安全讲起. 二.线程安全 ...
- jvm层面锁优化+一般锁的优化策略
偏向锁: 首先了解对象头MARK指针(对象头标记,32位): 存储GC标记,对象年龄,对象Hash,锁信息(锁记录的指针,偏向锁线程的ID) 大部分情况是没有竞争的,所以可以通过偏向来提高性能 所谓的 ...
- jvm高级特性(6)(线程的种类,调度,状态,安全程度,实现安全的方法,同步种类,锁优化,锁种类)
JVM高级特性与实践(十三):线程实现 与 Java线程调度 JVM高级特性与实践(十四):线程安全 与 锁优化 一. 线程的实现 线程其实是比进程更轻量级的调度执行单位. 线程的引入,可以把一个检查 ...
随机推荐
- 62.Xcode 添加代码块
1. Xcode创建一个新项目,打开一个.h或者.m文件 2.我举例以设置属性为例 #import <UIKit/UIKit.h> @interface ViewController : ...
- Oracle服务器修改IP后
机房有两套网络,一套办公网,一套机房的内网,办公网可以通过vpn在其他地方访问,内网只能在公司办公室访问.团队有同事去外地办公,开发的时候需要通过客户端直连数据库,于是把数据库服务器的网线换到办公网的 ...
- 860. Lemonade Change
class Solution { public: bool lemonadeChange(vector<int>& bills) { , ten = ; for (int i : ...
- Win7 VS2013环境cuda_7.5.18的一些坑
thrust库的sort算法,在x86平台使用就崩溃,x64就没问题,搜了下好像是很早的版本,4开始就有这样的问题了,原因不明. http://stackoverflow.com/questions/ ...
- Spring Boot项目Maven Build报错的解决方法
问题1, [ERROR]Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.21.0:test (defau ...
- maven下的经常使用的几个元素以及依赖范围的一些知识
maven的pom.xml配置文件里面的project根节点下的dependencies可以包含一个或者多个dependency元素,以声明一个或者多个依赖,每个依赖都可以包含的元素: groupId ...
- day2(基础数据类型)
一.基础数据类型操作 1.数字 int 数字主要是用于计算用的,使用方法并不是很多,就记住一种就可以: int.bit_length() -> int Number of bits necess ...
- Failed to place enough replicas
如果DataNode的dfs.datanode.data.dir全配置成SSD类型,则执行"hdfs dfs -put /etc/hosts hdfs:///tmp/"时会报如下错 ...
- GPIO工作模式
共8种工作模式,4种输入,1.输入浮空模式2.输入上拉模式 3.输入下拉模式4.模拟输入模式 4种输出模式:开漏输出.开漏复用功能.推挽输出.推挽复用输出 ps:mos管就是场效应管,三极管有的时候也 ...
- concurrent.future
concurrent.future module provides a high-level interface for asynchronously executing callables. Bas ...