Java 使用和不使用Volatile关键字的意外行为
标记stop volatile与否不会影响输出,它只会影响我是否增加了睡眠时间 标记停止挥发性或不挥发性不会影响输出,只是 影响我是否增加了睡眠时间 不使用volatile并不意味着共享同一变量的线程总是有一个未更新的值。Java 使用和不使用Volatile关键字的意外行为,java,multithreading,volatile,Java,Multithreading,Volatile,标记stop volatile与否不会影响输出,它只会影响我是否增加了睡眠时间 标记停止挥发性或不挥发性不会影响输出,只是 影响我是否增加了睡眠时间 不使用volatile并不意味着共享同一变量的线程总是有一个未更新的值。 其想法是,根据具体情况,它可能会在一个线程中出现一个未更新的变量,为了防止该变量出现,您应该使用volatile修饰符声明该变量。 在您的情况下,您没有看到问题,因为testThread可能尚未运行,因此stop变量的值尚未在该线程的内存中初始化。 增加sleep()的参数可
其想法是,根据具体情况,它可能会在一个线程中出现一个未更新的变量,为了防止该变量出现,您应该使用
volatile
修饰符声明该变量。在您的情况下,您没有看到问题,因为
testThread
可能尚未运行,因此stop
变量的值尚未在该线程的内存中初始化。增加
sleep()
的参数可以暂停当前线程。testThread
可以在自己的内存中运行并将变量的值初始化为false
。然后,恢复主线程并将
stop
设置为true:stop=true代码>所以testThread
没有看到对stop
的修改,预期的行为是什么?预期的行为是线程应该只停止,如果stop变量是volatile可能重复的,如果不能回答问题,请不要否决它“不影响输出”输出是什么?线停了吗?从你的回答中得到了一些信息
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();
}
}