前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >锁消除

锁消除

作者头像
吉林乌拉
发布2019-08-14 17:45:12
1.3K0
发布2019-08-14 17:45:12
举报
文章被收录于专栏:吉林乌拉
  • 锁消除

锁消除的意思是说虚拟机在运行时,虽然代码进行了同步,但是如果虚拟机检测到不存在数据竞争时,虚拟机就会自动把锁进行消除。锁消除主要的判定依据是如果堆上的所有数据都不会被其它的线程访问到,那么就可以理解为这些数据是线程私有的。既然是线程私有的,那么同步加锁也就没有存在的必要了,于是虚拟机就会将锁消除掉。我们看一下下面具体的代码来实际验证一下锁消除的实际应用。

上述代码中我们并没有添加任何同步方法。并且我们知道String是一个不可变的类,无论我们怎么操作底层的实现方式,都是会生成一个新的String来处理。所以上述代码在编译后会被优化。我们使用javac命令来查看一下编译后的代码是。

看完编译器优化后的代码,我们发现此时的代码已经无形中添加了同步方法。原因就是在append()方法的底层,实际就是一个synchronized类型的同步方法。我们看一下append()方法的源码如下。

源码中显示append()方法确实是一个同步方法,按照同步方法的规则,同步方法的锁就是当前对象也就是StringBuffer对象。虚拟机执行时发现同步方法锁的动态作用域是在concatString()方法的内部。也就是说其他线程无法访问到它,所以虽然方法是同步方法也就是添加了锁,但是虚拟机在执行时可以将锁消除掉,所以代码编译后,虚拟机执行上述代码时,就会忽略所有的同步而直接执行。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-07-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吉林乌拉 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档