我目前正在学习并发编程考试,不明白为什么这个程序的输出是 43。为什么 x = y + 1
在 t.start() 之前执行
?我还应该解释我使用了哪些发生在规则之前。
如果我理解程序顺序规则(线程中的每个 Action 发生在该线程中程序顺序中稍后出现的每个 Action 之前)t.start()
必须在 x = y + 1
以便线程 t 复制变量 x
,它将是 1。
public class HappensBefore {
static int x = 0;
static int y = 42;
public static void main(String[] args) {
x = 1;
Thread t = new Thread() {
public void run() {
y = x;
System.out.println(y);
};
};
t.start();
x = y + 1;
}
最佳答案
没有同步,没有volatile
字段,没有锁定,没有原子字段。代码可以按任何顺序执行。
是的,t.start()
将在 x = y + 1
之前执行。但是启动线程并不意味着线程体在x = y + 1
之前执行。它可以在 main()
的其余部分之前、之后或交错运行。
关于java - Java 内存模型中的 happens-before 规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48476916/