1. 概述

  JDK1.6版本花费了大量精力去实现各种锁优化,如适应性自旋,锁消除,锁粗化,轻量级锁,偏向锁等,这些技术都是为了在线程期间更高效的共享数据,以及解决竞争问题。

2. 自旋锁与自适应自旋

  传统的互斥锁对性能最大的影响是阻塞的实现,线程的挂起和恢复需要转入内核态中完成,相当影响效率。

  多线程场景下线程之间通过抢占CPU时间分片进行任务执行,有可能持有锁的线程很快就会释放锁,此时让后面的线程执行一个忙循环进行等待。这就是自旋锁。

  自选次数默认为10次,可使用 -XX:PreblockSpin参数来更改。

  jdk1.6 加入了自适应自旋锁,这意味着自旋时间不再是固定的,而是由上一次在同一个锁上的自旋时间及锁的拥有者状态来决定。随着JVM的运行,自旋时间的预测也将更加准确。

3. 锁消除

  锁消除是指在JVM即时编译器运行时,在对代码进行同步时,对检测到不存在共享数据竞争的锁进行消除。

4. 锁粗化

  如果一系列的连续操作都对同一个对象反复加锁和解锁,则将会把同步的范围粗化到整个操作序列的外部,这样只需要加一次锁就行了。

5. 偏向锁

  目的:在无竞争的情况下消除整个同步使用的互斥量,连CAS操作都不做了。

  定义:偏向锁会偏向第一个获得它的线程,如果在接下来的执行过程中该锁没有被其他线程获取,则持有偏向锁的线程以后进入这个锁相关的同步块不再需要进行同步。

  原理:

  1. 锁对象第一次被获取时,虚拟机会把,即偏向锁模式;
  2. 同时使用CAS操作将线程ID记录在对象的 Mark World 之中;
  3. 若CAS操作成功,则以后进入这个锁相关的同步块时不再进行任何同步操作。

  当另一个线程尝试获取这个锁时,偏向模式结束。此时根据锁对象是否处于锁定状态,将锁对象恢复到未锁定状态或者轻量级锁状态(锁的升级,单向不可逆)。

6. 轻量级锁

  目的:在无竞争的情况下使用CAS操作去消除同步使用的互斥量;

  原理:

  1. 代码进入同步块的时候,若锁对象没有被锁定。
  2. 虚拟机首先在栈帧中建立一个名为锁记录(Lock Record)的空间,存储锁对象的 Mark World 的拷贝;
  3. 虚拟机使用CAS操作将对象的 Mark World 更新为指向 Lock Record 的指针;
  4. 若这个CAS操作成功,则此对象处于轻量级锁定状态;
  5. 若这个CAS操作失败,则检查对象的 Mark World 是否已经指向当前线程栈帧中的 Lock Record,
  6. 若已经指向,则表明当前线程拥有该对象的锁,继续执行,否则膨胀为重量级锁。

JVM锁优化的更多相关文章

  1. 面试官:JVM锁优化都优化了啥?

    从JDK1.6开始,JVM对锁进行了各种优化,目的就是为了在线程间更高效的共享数据和解决互斥同步的问题.从锁优化的话题开始,可以引申出很多考点面试题,比如锁优化的技术.各优化技术的细节.CAS实现原理 ...

  2. JVM锁优化以及区别

    偏向所锁,轻量级锁都是乐观锁,重量级锁是悲观锁. 首先简单说下先偏向锁.轻量级锁.重量级锁三者各自的应用场景: 偏向锁:只有一个线程进入临界区: 轻量级锁:多个线程交替进入临界区: 重量级锁:多个线程 ...

  3. B5. Concurrent JVM 锁优化

    [概述] 高效并发是从 JDK1.5 到 JDK 1.6 的一个重要改进,HotSpot 虚拟机开发团队在这个版本上花费了大量的精力去实现各种锁优化技术,如适应性自旋(Adaptive Spining ...

  4. JVM中锁优化简介

    本文将简单介绍HotSpot虚拟机中用到的锁优化技术. 自旋锁 互斥同步对性能最大的影响是阻塞的实现,挂起线程和恢复线程的操作都需要转入内核态中完成,这些操作给系统的并发性能带来了很大的压力.而在很多 ...

  5. jvm(13)-线程安全与锁优化(转)

    0.1)本文部分文字转自“深入理解jvm”, 旨在学习 线程安全与锁优化 的基础知识: 0.2)本文知识对于理解 java并发编程非常有用,个人觉得,所以我总结的很详细: [1]概述 [2]线程安全 ...

  6. java源码剖析: 对象内存布局、JVM锁以及优化

    一.目录 1.启蒙知识预热:CAS原理+JVM对象头内存存储结构 2.JVM中锁优化:锁粗化.锁消除.偏向锁.轻量级锁.自旋锁. 3.总结:偏向锁.轻量级锁,重量级锁的优缺点. 二.启蒙知识预热 开启 ...

  7. 【JVM.12】线程安全与锁优化

    一.概述 面向过程的编程思想极大地提升了现代软件开发的生产效率和软件可以达到的规模,但是现实世界与计算机世界之间不可避免地存在一些差异,本节就如何保证并发的正确性和如何实现线程安全讲起. 二.线程安全 ...

  8. jvm层面锁优化+一般锁的优化策略

    偏向锁: 首先了解对象头MARK指针(对象头标记,32位): 存储GC标记,对象年龄,对象Hash,锁信息(锁记录的指针,偏向锁线程的ID) 大部分情况是没有竞争的,所以可以通过偏向来提高性能 所谓的 ...

  9. jvm高级特性(6)(线程的种类,调度,状态,安全程度,实现安全的方法,同步种类,锁优化,锁种类)

    JVM高级特性与实践(十三):线程实现 与 Java线程调度 JVM高级特性与实践(十四):线程安全 与 锁优化 一. 线程的实现 线程其实是比进程更轻量级的调度执行单位. 线程的引入,可以把一个检查 ...

随机推荐

  1. 在RedHat 和 Ubuntu 中配置 Delphi 的Linux开发环境(转)

    原文地址:http://chapmanworld.com/2016/12/29/configure-delphi-and-redhat-or-ubuntu-for-linux-development/ ...

  2. PHP中=>是什么意思

    一般用在php数组键名与元素的连接符如:$arr = array('a'=>'123','b'=>'456'); foreach($arr as $key=>$val){//$key ...

  3. OSS 视频存储

    我这里加了 封面图片 可以不理睬! 我没有存oss. 阿里的OSS 自己可以去官网下载 我这里放到 Vendor 下的. 1 # 注意这里OSS中 请设置 存储空间名称为公共的 才能直接使用这里返回的 ...

  4. poj-2406(字符串hash)

    题目链接:传送门 思路:字符串hash,终止条件竟然判断错了,真是太大意了. #include<iostream> #include<cstdio> #include<c ...

  5. centos firewalld 基本操作【转】

    1.firewalld的基本使用启动: systemctl start firewalld关闭: systemctl stop firewalld查看状态: systemctl status fire ...

  6. python3.4连接mysql5.7数据库增删改查

    #!/usr/bin/env python # -*- coding:utf-8 -*- # __author__ = "blzhu" """ pyt ...

  7. 变动事件_DOM2级的变动事件(mutation)

    DOM2级定义了如下变动事件: DOMSubtreeModified:在DOM结构中发生任何变化时触发.这个事件在其他任何事件触发后都会触发. DOMNodeInserted:在一个节点作为子节点被插 ...

  8. cyclone IV中DDR的一个疑惑

    的生成的DDR2 IP中DDR的时钟竟然是双向的,而在arria10中生成的DDR4则是输出,而DDR2的datasheet上也指出ck和ck#是输入,不知为什么? inout mem_clk , i ...

  9. 动态创建控件 #Create(...)

    在类中创建一个控件对象;例:CButton m_btn; 用Create创建一个对象(#其实已经与其绑定)m_btn.Create(.....); #注意Create()函数的参数 问题一:点击一个b ...

  10. js 构建map 和list

    //构建map function Map() { this.arr = new Array(); var struct = function(key, value) { this.key = key; ...