Java面试题-多线程3

Java面试题-多线程3又是一年招聘季,整理一些面试题,为自己也为大家整理点资料,希望大家成功上岸。1、什么是有序性问题单例模式中的懒汉机制中,就存在一个这样的问题。懒

大家好,欢迎来到IT知识分享网。

又是一年招聘季,整理一些面试题,为自己也为大家整理点资料,希望大家成功上岸。

1、什么是有序性问题

单例模式中的懒汉机制中,就存在一个这样的问题。

懒汉为了保证线程安全,一般会采用DCL的方式。

但是单单用DCL,依然会有几率出现问题。

线程可能会拿到初始化一半的对象去操作,极有可能出现NullPointException。(初始化对象三部,开辟空间,初始化内部属性,指针指向引用

Java编译.java为.class时,会基于JIT做优化,将指令的顺序做调整,从而提升执行效率。在CPU层面,也会对一些执行进行重新排序,从而提升执行效率。这种指令的调整,在一些特殊的操作上,会导致出现问题。

2、volatile的有序性底层实现

被volatile修饰的属性,在编译时,会在前后追加内存屏障

  • SS:屏障前的读写操作,必须全部完成,再执行后续操作
  • SL:屏障前的写操作,必须全部完成,再执行后续读操作
  • LL:屏障前的读操作,必须全部完成,再执行后续读操作
  • LS:屏障前的读操作,必须全部完成,再执行后续写操作
Java面试题-多线程3

这个内存屏障是JDK规定的,目的是保证volatile修饰的属性不会出现指令重排的问题。volatile在JMM层面,保证JIT不重排可以理解,但是,CPU怎么实现的。

Java面试题-多线程3

不同的CPU对内存屏障都有一定的支持,比如×86架构,内部自己已经实现了LS,LL,SS,只针对SL做了支持。

去openJDK再次查看,mfence是如何支持的。其实在底层还是mfence内部的lock指定,来解决指令重排问题。

Java面试题-多线程3

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/48758.html

(0)
上一篇 2024-09-04 19:33
下一篇 2024-09-05 21:00

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信