理解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先执行,就不会输出东西。请问我理解得对吗?
无
回复
1个回答

test
2024-06-19
没什么问题呀,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的执行顺序就是没有办法确定的
回复

适合作为回答的
- 经过验证的有效解决办法
- 自己的经验指引,对解决问题有帮助
- 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
- 询问内容细节或回复楼层
- 与题目无关的内容
- “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容