java并发教程指出:
对于引用变量和大多数原始变量(除了 long 和 double 之外的所有类型),读取和写入都是原子的。
对于声明为 volatile 的所有变量(包括 long 和 double 变量),读取和写入都是原子的。
我创建了一个简单的实验来测试这个
package experiment0;
public class Experiment0 {
public static int i=9;
public static void main(String[] args) {
i=9;
(new Thread(){
public void run(){
while(i==9){
//System.out.println("i==9");
}
System.out.println("\ni!=9");
}
}).start();
(new Thread(){
public void run(){
try{
Thread.sleep(3000);
i=8;
}catch(Exception e){
}
}
}).start();
}
}
当我运行此代码时,程序永远不会终止!为了让它工作,我要么取消注释第一个线程的 while 循环内的行,要么声明i
为volatile
. 我错过了什么吗?文档是否错误,是否应该说在这种情况下所有原语都应声明为易失性?为什么要写System.out
“解决”问题?它是否给第二个线程足够的时间来改变i
?