当前位置: 首页 > 知识库问答 >
问题:

java - 理解Java中的happens-before规则?

夏侯彬郁
2024-04-16
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个答案

程凯定
2024-04-16

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

 类似资料:
  • 本文向大家介绍JAVA内存模型和Happens-Before规则知识点讲解,包括了JAVA内存模型和Happens-Before规则知识点讲解的使用技巧和注意事项,需要的朋友参考一下 我们在本篇内容里聊一聊JAVA的内存模型和Happens-Before规则。 JAVA内存模型 这里的JAVA内存模型指的不是我们JVM专栏中提到的内存分布模型,而是针对并发编程的,小伙伴们不要混淆概念了。 我们已经

  • 9.2. Happens Before 在一个单独的goroutine中,变量的读和写操作顺序和代码所写的顺序一致。因此,在变量值没有 被改变的时候, 编译器和处理器可能会记录变量的操作顺序。但是,这种先验性的顺序记录会导致 在两个不同的goroutine对变量操作 顺序记录有差别。例如,一个goroutine执行 a = 1; b = 2; , 但是在另一个goroutine中可能会现感知到b被

  • 本文向大家介绍深入理解happens-before和as-if-serial语义,包括了深入理解happens-before和as-if-serial语义的使用技巧和注意事项,需要的朋友参考一下 概述 本文大部分整理自《Java并发编程的艺术》,温故而知新,加深对基础的理解程度。 指令序列的重排序 我们在编写代码的时候,通常自上而下编写,那么希望执行的顺序,理论上也是逐步串行执行,但是为了提高性能

  • 可能在内部使用的代码将在规则之后被取消,如下所示: ANTLR4就是这样做事的吗?

  • 众所周知,局部类是内部类。JLS 14.3 所有本地类均为内部类(§8.1.3)。 什么是内部阶级 JLS 8.1.3 如果O是C的直接封闭类型声明,并且C的声明不在静态上下文中出现,则内部类C是类或接口O的直接内部类。 类C是类或接口O的内部类,如果它是O的直接内部类或O的内部类的内部类。 这意味着内部类的声明不应该发生在非静态上下文中。但是考虑下面的程序: 演示 尽管是在静态上下文中声明的,但

  • 问题内容: 程序顺序规则指出:“线程中的每个动作都发生在该线程中的每个动作之后,程序顺序之后” 我在另一个线程中读到一个 动作 是 读取和写入变量 显示器的锁定和解锁 用线程开始和加入 这是否意味着可以按顺序更改读取和写入,但不能通过第二行或第三行中指定的操作更改读取和写入操作的顺序? 2.“程序顺序”是什么意思? 举例说明将非常有帮助。 其他相关问题 假设我有以下代码: 首先,它是一个单线程应用