博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
锁消除
阅读量:6970 次
发布时间:2019-06-27

本文共 971 字,大约阅读时间需要 3 分钟。

锁消除是指虚拟机即时编译器在运行时,对一些代码上要求同步,但是被检测到不可能存在共享数据竞争的锁进行削除。锁削除的主要判定依据来源于逃逸分析的数据支持,如果判断到一段代码中,在堆上的所有数据都不会逃逸出去被其他线程访问到,那就可以把它们当作栈上数据对待,认为它们是线程私有的,同步加锁自然就无须进行。

比如StringBuffer的append方法用了synchronized关键词,它是线程安全的。但我们可能仅在线程内部把StringBuffer当作局部变量使用:

public static String createStringBuffer(String str1, String str2) {        StringBuffer sBuf = new StringBuffer();        sBuf.append(str1);// append方法是同步操作        sBuf.append(str2);        return sBuf.toString();    }

代码中createStringBuffer方法中的局部对象sBuf,就只在该方法内的作用域有效,不同线程同时调用createStringBuffer()方法时,都会创建不同的sBuf对象,因此此时的append操作若是使用同步操作,就是白白浪费的系统资源。

这时我们可以通过编译器将其优化,将锁消除,前提是java必须运行在server模式(server模式会比client模式作更多的优化),同时必须开启逃逸分析:

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

其中+DoEscapeAnalysis表示开启逃逸分析,+EliminateLocks表示锁消除。

逃逸分析:比如上面的代码,它要看sBuf是否可能逃出它的作用域?如果将sBuf作为方法的返回值进行返回,那么它在方法外部可能被当作一个全局对象使用,就有可能发生线程安全问题,这时就可以说sBuf这个对象发生逃逸了,因而不应将append操作的锁消除,但我们上面的代码没有发生锁逃逸,锁消除就可以带来一定的性能提升。

转载于:https://www.cnblogs.com/amunote/p/10328164.html

你可能感兴趣的文章
MySQL创建表的语句
查看>>
POJ-3260 The Fewest Coins
查看>>
【OpenStack】源码级深入了解删除虚拟机操作
查看>>
【转】Multithreaded Python Tutorial with the “Threadworms” Demo
查看>>
在vue项目中,将juery设置为全局变量
查看>>
广工校赛决赛之简单的数论题
查看>>
SpringBoot集成Mybatis
查看>>
实操记录
查看>>
Entity Framework 6.0 Tutorials(11):Download Sample Project
查看>>
LeetCode – Refresh – Read N Characters Given Read4
查看>>
LeetCode – Refresh – ZigZag Conversion
查看>>
SQLHelper用的不爽,试试CmdRunner吧
查看>>
如何利用Visio设计一个系统的结构图
查看>>
Eclipse调试经验
查看>>
线程局部变量的使用
查看>>
angular style, class
查看>>
我的 FPGA 学习历程(14)—— PWM 脉冲宽度调制
查看>>
使用命名空间解决名字冲突
查看>>
dll劫持技术探索
查看>>
杭电 Problem 2089 不要62 【打表】
查看>>