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

Midclimateeee

通过百度: 1. 我知道java volatile可以保证可见性和有序性。 2. 我知道java单例实现:double-check模式需要加上volatile, **但是为什么需要加上volatile?百度好像有两种意见。** 基于**可见性** 的考虑,参考:[https://www.bilibili.com/video/BV1gX4y1a7sH?p=11&vd_source=80...](https://www.bilibili.com/video/BV1gX4y1a7sH?p=11&vd_source=801503831f64778f7f89c8223c80acac) 作者的意思:没有加上volatile,不同的线程间的缓存副本无法可见,导致重复多次初始化。 基于**有序性** 的考虑,参考:[https://blog.csdn.net/qq_44842835/article/details/132166785](https://link.segmentfault.com/?enc=SdiGpHN2ojNGS8Oa9U7fYQ%3D%3D.AuPlZZ%2FhXC2zfEwzN6xuTUWkJWNs%2FPY2HdjAjBgUm%2FB4JgipF0ibnfPpt0CIbrtA6BGZMUuEZKlSKRJQs3Bnhg%3D%3D) 作者的意思:对象实例化可以简单分为三步:1、分配内存 2、初始化对象 3、将对象的引用赋值给instance。因为指令重排,顺序可以变成1->3->2,因此其他线程很可能获得一个未完全初始化的实例。 请问上述两种观点谁对谁错?**能否能通过java代码来证明和实现?**

阅读量:22

点赞量:0

问AI
都对,理论是基于可见性的考虑 实际上了也基于有序性的考虑, 见: "https://blog.csdn.net/java_1996/article/details/87472644" (https://link.segmentfault.com/?enc=UJI85DGMBQ5VtOt2fSr0bw%3D%3D.QRt%2Bk4jeAoPSLHwfW8R1zcBnhaAfbU6eU5zzKaCif4sPnQh7ipbZbnIS3qHfYITb%2BIYF2quY%2FulJVDB2myw0Qg%3D%3D) 你可以试试在double-check单例模式里去掉volatile跑一下代码就可以看到问题了