Java锁消除
2015-06-05 14:38
411 查看
概述
锁消除是Java虚拟机在JIT编译是,通过对运行上下文的扫描,去除不可能存在共享资源竞争的锁,通过锁消除,可以节省毫无意义的请求锁时间。实验
看如下代码:package com.winwill.lock; /** * @author qifuguang * @date 15/6/5 14:11 */ 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"); } }
getString()方法中的StringBuffer数以函数内部的局部变量,进作用于方法内部,不可能逃逸出该方法,因此他就不可能被多个线程同时访问,也就没有资源的竞争,但是StringBuffer的append操作却需要执行同步操作:
@Override public synchronized StringBuffer append(String str) { toStringCache = null; super.append(str); return this; }
逃逸分析和锁消除分别可以使用参数-XX:+DoEscapeAnalysis和-XX:+EliminateLocks(锁消除必须在-server模式下)开启。使用如下参数运行上面的程序:
-XX:+DoEscapeAnalysis -XX:-EliminateLocks
得到如下结果:
使用如下命令运行程序:
-XX:+DoEscapeAnalysis -XX:+EliminateLocks
得到如下结果:
结论
由上面的例子可以看出,关闭了锁消除之后,StringBuffer每次append都会进行锁的申请,浪费了不必要的时间,开启锁消除之后性能得到了提高。相关文章推荐
- Resin 与 Eclipse的集成
- java中类、对象、实例的关系
- 非web工程java项目中的路径问题(针对以jar包运行的工程)
- intellij idea加载go开发插件源码时报错Error:ant: Cannot run 'patch-version' target: JDK '<unknown>' not found
- JAVA多线程实现的三种方式
- Java 中的内部类和匿名类
- Eclipse设置Android Logcat输出字体大小
- 10本Java经典书目推荐
- Failed executing 'cmd.exe /X /C ""C:\Program Files\Java\jdk1.6.0_38\jre\..\bin\jarsigner.exe"
- Java字符串按照中文拼音排序
- Java基础之hashCode方法详解
- Java自定义类型的排序
- java弹球
- Spring 监听ContextLoaderListener
- 【汇总】eclipse相关问题
- spring security3的filter链
- Java偏向锁
- Spring+Quartz实现定时任务的配置方法(插曲)
- 20150605面试汇总--jdk常用package
- eclipse tab空格设置