java double-check为啥要加volatile(是因为可见性还是有序性)?

通过百度:

  1. 我知道java volatile可以保证可见性和有序性。
  2. 我知道java单例实现:double-check模式需要加上volatile,

但是为什么需要加上volatile?百度好像有两种意见。

基于可见性的考虑,参考:https://www.bilibili.com/video/BV1gX4y1a7sH?p=11&vd_source=80...
作者的意思:没有加上volatile,不同的线程间的缓存副本无法可见,导致重复多次初始化。

基于有序性的考虑,参考:https://blog.csdn.net/qq_44842835/article/details/132166785
作者的意思:对象实例化可以简单分为三步:1、分配内存 2、初始化对象 3、将对象的引用赋值给instance。因为指令重排,顺序可以变成1->3->2,因此其他线程很可能获得一个未完全初始化的实例。

请问上述两种观点谁对谁错?能否能通过java代码来证明和实现?


回答:

都对,理论是基于可见性的考虑 实际上了也基于有序性的考虑, 见:
https://blog.csdn.net/java_1996/article/details/87472644
你可以试试在double-check单例模式里去掉volatile跑一下代码就可以看到问题了

以上是 java double-check为啥要加volatile(是因为可见性还是有序性)? 的全部内容, 来源链接: utcz.com/p/945393.html

回到顶部