java - Java 内存模型中的 happens-before 规则

标签 java multithreading concurrency java-memory-model happens-before

我目前正在学习并发编程考试,不明白为什么这个程序的输出是 43。为什么 x = y + 1t.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/

相关文章:

Java减少对象的大小

multithreading - tomcat关闭时关闭线程的正确方法是什么?

c++ - 使用 MinGW gcc 4.4.0 boost thread_interrupted 异常终止(),3.4.5 OK

java - ReentrantLock.Sync 中当前线程变量的搭载是如何工作的?

Java通过\\S分割

java - 将 Java Web 服务 WSDL 与 gsoap C 客户端一起使用时出现标记不匹配错误

java - JPanel 设置

c# - MsgWaitForMultipleObjects 的 C# 等价物是什么?

c++ - cuFFT 流的并发

c# - 并发文件写入