189 8069 5689

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

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

10余年的迁西网站建设经验,针对设计、前端、开发、售后、文案、推广等六对一服务,响应快,48小时及时工作处理。网络营销推广的优势是能够根据用户设备显示端的尺寸不同,自动调整迁西建站的显示方式,使网站能够适用不同显示终端,在浏览器中调整网站的宽度,无论在任何一种浏览器上浏览网站,都能展现优雅布局与设计,从而大程度地提升浏览体验。创新互联从事“迁西网站设计”,“迁西网站推广”以来,每个客户项目都认真落实执行。

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有没有指令重排序的功能”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注创新互联行业资讯频道。


本文名称:synchronized有没有指令重排序的功能
地址分享:http://cdxtjz.cn/article/piioig.html

其他资讯