happens-before规则是java并发编程中的一项重要概念,它定义了线程之间操作的顺序依赖性。
以这段代码为例:
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); } } }
根据happens-before规则:
立即学习“Java免费学习笔记(深入)”;
- 在一个线程中,前面的操作happens-before于后面的任意操作(规则1)
- 对一个volatile变量的写操作,happens-before于后续对这个变量的读操作(规则2)
因此,如果语句2(将flag设置为true)在语句3(检查flag)之前执行,则保证在多线程环境下读者线程也能看到a的值为1。
然而,在多线程情况下,如果没有使用同步机制,语句2和3的执行顺序是无法确定的。因此,即使writer()方法先于reader()方法执行,也可能出现语句3在语句2之前执行的情况,导致无法输出任何内容。