深入理解JVM后端优化技术-锁粗化(Lock Coarsening)

锁粗化(Lock Coarsening/Lock Merging)是JIT编绎器对内部锁的具体实现所做的一种优化。

相关系列

深入理解jvm执行引擎-CSDN博客

深入理解JVM后端优化技术-方法内联-CSDN博客

深入理解JVM后端优化技术-逃逸分析(Escape Analysis)-CSDN博客

深入理解JVM后端优化技术-锁消除(Lock Elision)-CSDN博客

相关JVM设置

锁粗化默认是开启的。如果要关闭这个特性,我们可以在Java程序的启动命令行中添加虚拟机参数"-XX:-EliminateLocks"(开启则可以使用虚拟机参数"-XX:+EliminateLocks")。

定义

看上图,对于相邻的几个同步块如果使用同一个锁实例,那么JIT编绎器会将这些同步块合并成一个大的同步块,从而避免一个线程反复申请、释放锁所导致的开销。

注意事项

但是,锁粗化很有可能会导致一个线程持有锁的时间变长,从而使得同步在该锁之上的其它线程在申请锁时的等待时间变长。看上图,第一个同步块和第二个同步块开始之间时间间隙中,其它线程本来是机会获取获得monitorX的,但是经过锁粗化之后由于临界区的长度变长,这些线程在申请monitorX时所需的等待时间也变长了。所以,锁粗化不会应用到循环体内的相邻的同步块。

案例分析

java 复制代码
package com.dzend.mall.order;

import java.util.Random;

public class LockCoarseningTest {

    private final Random random = new Random();

    public void genIQ(){        
        int iq1 =randomIQ();
        int iq2=randomIQ();
        int iq3=randomIQ();
        act(iq1,iq2,iq3);
    }

    private void act(int iq1,int iq2,int iq3){
        System.out.printf("iq1="+iq1 +";iq2="+iq2+";iq3="+iq3);
    }

    public int randomIQ(){
        return (int)Math.round(random.nextGaussian()*15+100);
    }
}

执行流程分析

genIQ方法连续调用randomIQ方法来生成3个符合正态分布的随机智商。在genIQ方法被执行次数达到JVM设置的阈值时,就会触发JIT编绎器对其进行一系列的优化。

1、JIT编绎器会把randomIQ方法内联(Inline)到genIQ中,把randomIQ中的代码指令复制到genIQ方法体中。

2、Random.nextGaussian是一个同步方法,由于Random实例random可能被多个线程共享,JIT编绎器无法对Random.nextGaussian方法本身执行锁消除优化,导致被内联到genIQ方法中的Rand.nextGaussian方法相当一个random引导的同步块。

3、经过以上流程优化过后,就会执行锁粗化。

相关推荐
zh15702321 分钟前
如何编写动态SQL存储过程_使用sp_executesql执行灵活查询
jvm·数据库·python
2401_8242226926 分钟前
SQL报表统计数据量巨大_分批统计策略
jvm·数据库·python
X566129 分钟前
mysql如何处理连接数过多报错_调整max_connections参数
jvm·数据库·python
m0_6091604943 分钟前
MongoDB中什么是Hashed Shard Key的哈希冲突_哈希函数的分布均匀性分析
jvm·数据库·python
2401_833033623 小时前
C#怎么使用协变和逆变 C#泛型中的in和out关键字协变逆变是什么意思怎么用【语法】
jvm·数据库·python
m0_624578593 小时前
JavaScript 中高精度小数(20位以上)的正确处理方法
jvm·数据库·python
m0_740352423 小时前
如何用 Symbol 作为对象属性键名防止第三方库属性覆盖
jvm·数据库·python
m0_613856293 小时前
如何用 ArrayBuffer 在 Fetch 中处理低级别的二进制流
jvm·数据库·python
m0_736439303 小时前
如何防止SQL非法金额输入_利用触发器实现精确度校准
jvm·数据库·python
2301_815901973 小时前
HTML函数在4K显示器上显示异常吗_高分辨率硬件适配问题【详解】
jvm·数据库·python