为什么在下面的Java代码中,线程输出为2次i=0?如果我们创建多个线程会发生什么??为什么?

为什么在下面的Java代码中,线程输出为2次i=0?如果我们创建多个线程会发生什么??为什么?,java,multithreading,Java,Multithreading,公共类MyThread扩展线程{ static int i=0; public void run() { for(;i<10;i++) { System.out.println("i = " + i); } } }几乎可以同时在System.out.println块中运行两次。然后得到两倍的输出0。没有任何东西可以阻止线程同时运行run方法。您提出的是关于可见性和原子性的问题。 i的值可以缓存在处理器缓存中,增加的值不能保证立即传播到共享内存。所以

公共类MyThread扩展线程{

static int i=0;
public void run()
{
    for(;i<10;i++)
    {
        System.out.println("i = " + i);
    }
}

}

几乎可以同时在System.out.println块中运行两次。然后得到两倍的输出0。没有任何东西可以阻止线程同时运行run方法。

您提出的是关于可见性和原子性的问题。 i的值可以缓存在处理器缓存中,增加的值不能保证立即传播到共享内存。所以你得到了完全不可预测的结果。此外,i++不是原子的,除了printl之外,我还有一个单独的操作


为了便于查看,请仅使用volatile。为了完全正确,请使用原子变量。

什么是“未定义”?你的意思是“每次都有不同的输出”?对于非原子读写的共享值,会发生这种情况。您的意思是“为什么它打印
i=0
2次”?这将发生在您以非原子方式读写的共享值上。请以总结的方式更新问题,并在博文正文中简要解释。您应该阅读,尤其是关于
public static void main(String... s) {

    MyThread th1=new MyThread();
    th1.start();

    MyThread th2=new MyThread();
    th2.start();


}