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

Java类实现Runnable,创建新线程,然后返回奇怪的结果。为什么?,java,multithreading,runnable,java-threads,Java,Multithreading,Runnable,Java Threads,我正在学习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 Threa

我正在学习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);
        }
    }
}
结果:是的 不 不 不 不 不 不 不 不 没有


为什么第一个结果返回为“是”,然后将其设置为“否”?

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

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

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


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

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


首先,您得到是,然后是否。主线程首先打印是,然后JVM启动子线程,该子线程更改了消息的值,然后控制返回到主线程,它将消息打印为否,直到循环结束。

当您从println转到print时,消息是否会更改,以便缓冲区不会被刷新,I/O会被延迟?每次运行时这个程序会让你得到不同的结果事实并非如此。我运行了100次,每次都返回相同的结果。