首页 > 其他分享 >面试题 锁消除是什么

面试题 锁消除是什么

时间:2023-02-14 11:03:02浏览次数:50  
标签:面试题 String StringBuffer 什么 编译器 XX sb 消除


锁消除是在编译器级别的事情。

在即时编译器时,如果发现不可能被共享的对象,则可以消除这些对象的锁操作。

也许你会觉得奇怪,既然有些对象不可能被多线程访问,那为什么要加锁呢?写代码时直接不加锁不就好了。

但是有时,这些锁并不是程序员所写的,有的是JDK实现中就有锁的,比如Vector和StringBuffer这样的类,它们中的很多方法都是有锁的。当我们在一些不会有线程安全的情况下使用这些类的方法时,达到某些条件时,编译器会将锁消除来提高性能

面试题 锁消除是什么_开发语言

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

public static void main(String[] args) {
long tsStart = System.currentTimeMillis();
for (int i = 0; i < 1000000; i++) {
getString("TestLockEliminate ", "Suffix");
}
System.out.println("一共耗费:" + (System.currentTimeMillis() - tsStart) + " ms");
}
}

 上述代码中的StringBuffer.append是一个同步操作,但是StringBuffer却是一个局部变量,并且方法也并没有把StringBuffer返回,所以不可能会有多线程去访问它。那么此时StringBuffer中的同步操作就是没有意义的。

开启锁消除是在JVM参数上设置的,当然需要在server模式下:

并且要开启逃逸分析。 逃逸分析的作用呢,就是看看变量是否有可能逃出作用域的范围

当JVM参数为:

-server -XX:+DoEscapeAnalysis -XX:+EliminateLocks

耗时119ms

面试题 锁消除是什么_System_02

面试题 锁消除是什么_JVM_03

当JVM参数为:

-server -XX:+DoEscapeAnalysis -XX:-EliminateLocks

耗时140ms

面试题 锁消除是什么_java_04

面试题 锁消除是什么_后端_05

 表明锁消除的效果还是很明显的。

标签:面试题,String,StringBuffer,什么,编译器,XX,sb,消除
From: https://blog.51cto.com/u_15258465/6056167

相关文章

  • 互联网给我们带来了什么。。。
    网聊多了,谈心少了。套路多了,真诚少了。兄弟多了,朋友少了。情人多了,爱人少了。关系多了,知己少了。算计多了,坦诚少了。骗子多了,良心少了。打字多了,说话少了。情感多......
  • 什么是衍生品,作用是啥?
    我们搜索“衍生品”时,满屏都是跟金融有关的,到底什么是衍生品?它有啥作用呢?定义衍(yǎn):外部是“行”字,“行”为道路,引申为一切通道;中间为“水”或“川”字,表示河川。二者相......
  • JavaScript 数字是什么?
    本文首发自「慕课网」,想了解更多IT干货内容,程序员圈内热闻,欢迎关注!作者|慕课网精英讲师然冬基于IEEE754标准的双精度64位二进制格式的值(-(253-1)到253-1)。——MDN......
  • vue为什么v-for的优先级比v-if的高?
    前言有时候有些面试中经常会问到v-for与v-if谁的优先级高,这里就通过分析源码去解答一下这个问题。下面的内容是在当我们谈及v-model,我们在讨论什么?的基础上分析的,所以......
  • 前端一面必会vue面试题总结
    Vue模板编译原理Vue的编译过程就是将template转化为render函数的过程分为以下三步第一步是将模板字符串转换成elementASTs(解析器)第二步是对AST进行静态节......
  • new Vue的时候到底做了什么
    Vue加载流程1.初始化的第一阶段是Vue实例也就是vm对象创建前后:首先Vue进行生命周期,事件初始化发生在beforeCreate生命周期函数前,然后进行数据监测和数据代理的初始化,也就......
  • 前端二面经典vue面试题总结
    Vue加载流程1.初始化的第一阶段是Vue实例也就是vm对象创建前后:首先Vue进行生命周期,事件初始化发生在beforeCreate生命周期函数前,然后进行数据监测和数据代理的初始化,也就......
  • 前端二面经典react面试题
    如何解决props层级过深的问题使用ContextAPI:提供一种组件之间的状态共享,而不必通过显式组件树逐层传递props;使用Redux等状态库。react实现一个全局的dialogimpo......
  • 京东前端react面试题及答案
    useEffect与useLayoutEffect的区别(1)共同点运用效果:useEffect与useLayoutEffect两者都是用于处理副作用,这些副作用包括改变DOM、设置订阅、操作定时器等。在函数......
  • 我为什么要放弃 RESTful,选择拥抱 GraphQL 转载
    REST作为一种现代网络应用非常流行的软件架构风格,自从RoyFielding博士在2000年他的博士论文中提出来到现在已经有了20年的历史。它的简单易用性,可扩展性,伸缩性受到广大Web......