温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

synchronized有没有指令重排序的功能

发布时间:2022-05-23 15:50:50 来源:亿速云 阅读:306 作者:iii 栏目:大数据

本文小编为大家详细介绍“synchronized有没有指令重排序的功能”,内容详细,步骤清晰,细节处理妥当,希望这篇“synchronized有没有指令重排序的功能”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

1.volatile可以禁止指令的重排序功能。那么synchronized有这个功能吗?

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

1. int a = 100 ;
2. int b ;
3. b = 200 ;
4. int c = a * b ;

根据重排序,以上代码的实际执行顺序可以是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的内存是否充足,都会去主动回收弱引用对象。

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

读到这里,这篇“synchronized有没有指令重排序的功能”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注亿速云行业资讯频道。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI