public class ThreadVolatilePerfectExample2 {
public static boolean stop = false; // not volatile
public static void main(String args[]) throws InterruptedException {
Thread testThread = new Thread(){
@Override
public void run(){
int i = 1;
while(!stop){
i++;
}
System.out.println("Thread stop i="+ i);
}
};
testThread.start();
Thread.sleep(1);
stop = true;
System.out.println("now, in main thread stop is: " + stop);
testThread.join();
}
}
标记停止易失性不影响输出,只影响我增加了睡眠时间。
答案 0 :(得分:0)
标记停止易失性不会影响输出,它只是 影响如果我增加了睡眠时间。
不使用volatile并不意味着共享同一个变量的线程总是没有更新的值。
根据具体情况,可以并且为了防止在一个线程中有一个未更新的变量,你应该使用volatile
修饰符声明变量。
在您的情况下,您没有看到问题,因为testThread
可能尚未运行,因此stop
变量的值尚未在此线程的内存中初始化。 />
增加sleep()
的参数允许当前线程暂停。
testThread
可以运行并将变量的值初始化为自己内存中的false
。
然后,恢复主线程并将stop
设置为true:stop = true;
因此testThread
看不到stop
上的修改。