使用和没有易失性关键字的意外行为

时间:2017-08-20 11:19:53

标签: java multithreading 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();
     }
 }

标记停止易失性不影响输出,只影响我增加了睡眠时间。

1 个答案:

答案 0 :(得分:0)

  

标记停止易失性不会影响输出,它只是   影响如果我增加了睡眠时间。

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

根据具体情况,可以并且为了防止在一个线程中有一个未更新的变量,你应该使用volatile修饰符声明变量。

在您的情况下,您没有看到问题,因为testThread可能尚未运行,因此stop变量的值尚未在此线程的内存中初始化。 />

增加sleep()的参数允许当前线程暂停。
testThread可以运行并将变量的值初始化为自己内存中的false
然后,恢复主线程并将stop设置为true:stop = true;因此testThread看不到stop上的修改。