大家好,欢迎来到IT知识分享网。
又是一年招聘季,整理一些面试题,为自己也为大家整理点资料,希望大家成功上岸。
1、什么是有序性问题
单例模式中的懒汉机制中,就存在一个这样的问题。
懒汉为了保证线程安全,一般会采用DCL的方式。
但是单单用DCL,依然会有几率出现问题。
线程可能会拿到初始化一半的对象去操作,极有可能出现NullPointException。(初始化对象三部,开辟空间,初始化内部属性,指针指向引用)
在Java编译.java为.class时,会基于JIT做优化,将指令的顺序做调整,从而提升执行效率。在CPU层面,也会对一些执行进行重新排序,从而提升执行效率。这种指令的调整,在一些特殊的操作上,会导致出现问题。
2、volatile的有序性底层实现
被volatile修饰的属性,在编译时,会在前后追加内存屏障。
- SS:屏障前的读写操作,必须全部完成,再执行后续操作
- SL:屏障前的写操作,必须全部完成,再执行后续读操作
- LL:屏障前的读操作,必须全部完成,再执行后续读操作
- LS:屏障前的读操作,必须全部完成,再执行后续写操作
这个内存屏障是JDK规定的,目的是保证volatile修饰的属性不会出现指令重排的问题。volatile在JMM层面,保证JIT不重排可以理解,但是,CPU怎么实现的。
不同的CPU对内存屏障都有一定的支持,比如×86架构,内部自己已经实现了LS,LL,SS,只针对SL做了支持。
去openJDK再次查看,mfence是如何支持的。其实在底层还是mfence内部的lock指定,来解决指令重排问题。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/48758.html