2017-08-20 34 views
-5
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

预期的行为是线程应该只停止,如果停止变量是不稳定的 – Tenacious

+0

可能重复[为什么Java没有看到从另一个线程更新的值?](https://stackoverflow.com/questions/21135870/why-does-java -not-see-the-updated-value-from-another-thread) –

回答

0

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

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

的想法是,根据情况,可能并从具有一个线程没有更新变量阻止,你应该用volatile修改声明变量。

在你的情况,你看不到的问题,因为testThread恐怕还没有开始运行,所以stop变量的值并没有在这个线程的内存尚未初始化。

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

+0

从你的回答中得到了一些东西 – Tenacious