首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

synchronized有指令重排序的功能吗?

1.颜老师,volatile可以禁止指令的重排序功能。那么synchronized有这个功能吗?我百度、谷歌都查不到准确的说法。

答:百度、谷歌都查不到,很大程度说明这个问题没有意义。

重排序是指JVM为了提高执行效率,会对我们编写的代码进行一些额外的优化。敲重点:重排序所实现的优化不会影响单线程程序执行结果

根据重排序,以上代码的实际执行顺序可以是1、2、3、4,也可以是2、3、1、4,还可以是2、1、3、4等,因为这几种可能的最终执行结果都是相同的。(实际上第4句还可以再拆)

而synchronized的作用是加锁,可以保证串行执行,即可以让并发环境 转为单线程环境。因此加了synchronized就已经是单线程环境了。既然是单线程,那么无论是否进行了重排序,最终的结果都不会有影响,即都可以保证线程安全。所以说,在使用synchronized时根本不用关心“重排序”这个问题,无论它支持或不支持,都已经不重要了。

2.之前有听说:Java 中String定义的变量值不可改变,例如String str="a",str="b",则表示 第一次str指向"a",第二次str指向"b"。但源码里String是final修饰的,str的“指向”应该不能变的吧?

答:String是final修饰的,说明String这个“类”是final的,这一点只能说明String不能被继承(概念:final修饰的类不能被继承);而str指向什么,跟“final 类”没有任何关系,所以你把二者搞混了。

3.颜老师,“如果一个对象存在着指向它的引用,那么这个对象就不会被GC回收”,这句话对吗?

不对。JVM中存在着四种类型的引用:强引用、软引用、弱引用和虚引用。

你这句话只适用于“强引用”,Object ref = new Object()中的ref就是一个强引用。但除此以外,还有以下三个:

软引用:当JVM的内存足够时,GC不会主动回收软引用对象;但当JVM的内存不足时,GC就会去主动回收软引用对象。

弱引用:当GC进行垃圾回收时,无论是否当时JVM的内存是否充足,都会去主动回收弱引用对象。

虚引用:是否使用虚引用对于一个对象本身来说都没有任何区别。虚引用的价值在于和引用队列一起使用。

综上,软引用、弱引用和虚引用都是你那句话的反例。

--- 完 ---

说明:

1、本文为作者(颜群)当下观点,仅供参考;若有异议,欢迎在留言区讨论。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20191119A0KR9700?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券