Java class 实现 Runnable,创建新线程,然后 returns 奇怪的结果。为什么?

Java class implements Runnable, creates new thread, then returns strange results. Why?

我正在了解 Java 及其怪癖。这是怎么回事?

public class myThread implements Runnable {

    String msg = "yes";

    public void run() {
        this.msg = "No";
    }

    public static void main(String[] args) {
        myThread one = new myThread();
        (new Thread(one)).start();

        for (int i = 0; i < 10; i++) {
            System.out.println(one.msg);
        }
    }
}

结果:是 不 不 不 不 不 不 不 不 否

为什么第一个结果 return 为 'yes',然后将其设置为 'No'?

因为 start() 开始新线程和修改 msg 花费的时间稍长,所以在线程开始之前完成了一个循环迭代。第一次迭代后,msg 已被线程修改并显示 No

您的新线程在后台运行,而主线程继续运行。

两者之间没有同步,所以后台线程会在完全未指定的某一点将值从"yes"更改为"no"。与此同时,主线程只是打印它此时看到的内容。

如果我正确理解 Java 内存模型,在没有任何 synchronizedvolatile 或其他同步构造的情况下,甚至不能保证主线程看到其他线程的更改完全

您已经创建了一个新的 Thread 并调用了 start() 方法来开始执行。但是 JVM 决定线程何时会 运行。每次你 运行 程序你都会得到不同的结果。

首先你得到 yes 然后 No。主线程首先打印 yes 然后 JVM 启动子线程更改 msg 的值,然后控制权返回主线程并将 msg 打印为 No 直到结束循环。