Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用和不使用Volatile关键字的意外行为_Java_Multithreading_Volatile - Fatal编程技术网

Java 使用和不使用Volatile关键字的意外行为

Java 使用和不使用Volatile关键字的意外行为,java,multithreading,volatile,Java,Multithreading,Volatile,标记stop volatile与否不会影响输出,它只会影响我是否增加了睡眠时间 标记停止挥发性或不挥发性不会影响输出,只是 影响我是否增加了睡眠时间 不使用volatile并不意味着共享同一变量的线程总是有一个未更新的值。 其想法是,根据具体情况,它可能会在一个线程中出现一个未更新的变量,为了防止该变量出现,您应该使用volatile修饰符声明该变量。 在您的情况下,您没有看到问题,因为testThread可能尚未运行,因此stop变量的值尚未在该线程的内存中初始化。 增加sleep()的参数可

标记stop volatile与否不会影响输出,它只会影响我是否增加了睡眠时间

标记停止挥发性或不挥发性不会影响输出,只是 影响我是否增加了睡眠时间

不使用volatile并不意味着共享同一变量的线程总是有一个未更新的值。

其想法是,根据具体情况,它可能会在一个线程中出现一个未更新的变量,为了防止该变量出现,您应该使用
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();
     }
 }