为什么在下面的Java代码中,线程输出为2次i=0?如果我们创建多个线程会发生什么??为什么?
公共类MyThread扩展线程{为什么在下面的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的值可以缓存在处理器缓存中,增加的值不能保证立即传播到共享内存。所以
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();
}