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

相关模块

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

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

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

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

通过逃逸分析后,就可进行下一步优化,锁消除 lock elision可以直接进行的优化措施。

定义

这个优化措施主要针对synchronized关键字。当JVM检测到一个锁的代码不存在多线程竞争时,会对这个对象的锁进行锁消除。

多线程并发资源竞争是一个很复杂的场景,所以要检测是否存在多线程竞争是不容易的。

但是有一个

例外,如果一个方法没有发生逃逸,那么它的内部的锁都是不存在竞争的。

代码案例展示

java 复制代码
public class LockElisionTest {

    public static String BufferString(String s1,String s2){
        StringBuffer sb = new StringBuffer();
        sb.append(s1);
        sb.append(s2);
        return sb.toString();
    }

    public static String BuildString(String s1,String s2){
        StringBuilder sb = new StringBuilder();
        sb.append(s1);
        sb.append(s2);
        return sb.toString();
    }

    public static void main(String[] args) {
        long start1 = System.currentTimeMillis();
        for(int i=0;i<10000000;i++){
            BufferString("1111111","2222222");
        }
        System.out.println("StringBuffer耗时:" + (System.currentTimeMillis()-start1));

        long start2 = System.currentTimeMillis();
        for(int i=0;i<10000000;i++){
            BuildString("1111111","2222222");
        }
        System.out.println("StringBuild耗时:" + (System.currentTimeMillis()-start2));


    }
}

关于StringBuffer和StringBuild区别说明

分别对StringBuffer和StringBuild的字符串构建方法进行了测试。这两个方法在功能上没有什么区别,最大的区别在于,StringBuffer是线程安全,对append和toString都加了synchronized同步锁,而StringBuilder没有加。synchronized关键字是在Class文件中添加了monitorenter和monitorexit两个字节码指令的,所以,StringBuffer比StringBuild更慢。

案例分析

开启JVM锁消除

在当前代码中,BufferString方法只是在main这一个线程里调用 ,不存在线程竞争,所有这个synchronized同步锁是没有作用的,因此,触发JIT后,JVM会在编绎时对这个无用的锁进行消除。这样,两个方法的耗时是差不多。

StringBuffer耗时:279

StringBuild耗时:192

关闭锁消除

通过设置JVM参数:-XX:-EliminateLocks 主动关闭锁消除后,再执行这个案例,就能明显看出差距了

StringBuffer耗时:1013

StringBuild耗时:107

相关推荐
野犬寒鸦2 小时前
从零起步学习JVM || 第一章:类加载器与双亲委派机制模型详解
java·jvm·数据库·后端·学习
符哥20086 小时前
C++ 进阶知识点整理
java·开发语言·jvm
夕除7 小时前
js--15
java·jvm·spring
4311媒体网9 小时前
C语言操作符全解析 C语言操作符详解
java·c语言·jvm
猫头虎19 小时前
如何排查并解决项目启动时报错Error encountered while processing: java.io.IOException: closed 的问题
java·开发语言·jvm·spring boot·python·开源·maven
wgslucky19 小时前
jdk17 配置jvm参数中gc的日志及控制日志数量和大小
jvm·gc·-xlog
痴儿哈哈1 天前
自动化机器学习(AutoML)库TPOT使用指南
jvm·数据库·python
野犬寒鸦1 天前
从零起步学习并发编程 || 第七章:ThreadLocal深层解析及常见问题解决方案
java·服务器·开发语言·jvm·后端·学习
闻哥1 天前
Kafka高吞吐量核心揭秘:四大技术架构深度解析
java·jvm·面试·kafka·rabbitmq·springboot
星辰_mya1 天前
Elasticsearch线上问题之慢查询
java·开发语言·jvm