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先执行,就不会输出东西。请问我理解得对吗?
无
没什么问题呀,happens-before规则的这三条可以得出如果2在3之前发生,输出1这个结论。
1.
在一个线程中,按照代码的顺序,前面的操作Happens-Before于后面的任意操作
2.
对一个volatile变量的写操作,Happens-Before于后续对这个变量的读操作
3.
如果A Happens-Before B,并且B Happens-Before C,则A Happens-Before C
多线程情况下你没有使用锁或者synchronized来实现线程同步的话,2和3的执行顺序就是没有办法确定的