面试题 锁消除是什么

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了面试题 锁消除是什么相关的知识,希望对你有一定的参考价值。


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

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

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

但是有时,这些锁并不是程序员所写的,有的是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

面试题

面试题

当JVM参数为:

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

耗时140ms

面试题

面试题

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

以上是关于面试题 锁消除是什么的主要内容,如果未能解决你的问题,请参考以下文章

四面美团开发岗,面试题分享

一个读写锁面试题

一个读写锁面试题

面试题:写一个死锁示例

Java基础 面试题

C#面试题--递归包含锁