推荐 最新
无敌英俊大师兄

理解Java中的happens-before规则?

class ReorderExample { int a = 0; boolean volatile flag = false; public void writer() { a = 1; //1 flag = true; //2 } Public void reader() { if (flag) { //3 int i = a * a; //4 System.out.println(i); } } } 这段代码如果2在3之前发生,那根据happens-before规则,确实会输出1。但是,就算先执行writer()方法,再执行reader()方法,在多线程情况下,也可能3比2先执行,就不会输出东西。请问我理解得对吗? 无

0
1
0
浏览量155
Midclimateeee

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

通过百度: 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代码来证明和实现?

0
1
0
浏览量21