public class HappensBeforePuzzle {
static int x, y;
static void method1() {
x = 10;
y = 20;
}
static void method2() {
System.out.println(x); // 可能打印出0,因为x未必按预期happens-before于y=20
System.out.println(y);
}
public static void main(String[] args) {
// 在不同的线程中执行方法
new Thread(method1).start();
new Thread(method2).start();
}
}
这个示例代码展示了在Java中,不同方法之间没有明确的happens-before关系,导致并发执行时可能产生意外的结果。在这个例子中,method1
中的赋值操作x = 10
和y = 20
之间不存在happens-before关系,因此,在method2
中打印x
的值时可能会看到默认值0,而不是预期的10。这说明了在并发编程中,必须正确地指定happens-before关系以保证程序的正确性。