理解Java中的happens-before规则?

作者站长头像
站长
· 阅读数 18
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个回答
avatar
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的执行顺序就是没有办法确定的

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