zoukankan      html  css  js  c++  java
  • Java Volatile的一个实际应用场合

    Consider the following example:

    package thread;
    public class ThreadVerify {
      public static boolean  stop = false;
      public static void main(String args[]) throws InterruptedException {
          Thread testThread = new Thread(){
                @Override
                public void run(){
                  int i = 1;
                  while(!stop){
                   //System.out.println("in thread: " + Thread.currentThread() + " i: " + i);
                      i++;
                  }
                  System.out.println("Thread stop i="+ i);
               }
             };
             testThread.start();
             Thread.sleep(1000);
             stop = true;
             System.out.println("now, in main thread stop is: " + stop);
             testThread.join();
         }
     }
    

    The working thread is started to do increment on i and after one second, the flag is set as true in main thread. It is expected that we could see print out in working thread: “Thread stop i=”. Unfortunately it is NOT the case.
    Through process explorer we can find the working thread is still running:

    The only way we can terminate it is to click this button in Eclipse:

    The reason is: every thread in Java has its own thread local stack in runtime. Every time a thread tries to access the content of a variable, it first locates the variable content in the main memory, then loads this content from main memory to its local stack. Once this load is done, this relationship between thread local stack and main memory is cut.

    Later, when thread performs modifications on the variable, the change is directly done on thread local stack. And at a given time ( scheduled by JVM, developer has no control about this timeslot), the change will be refreshed from thread local stack to memory. Back to our example, already the main thread has changed the flag to true in one second later ( this is TOO late! ), unfortunately when the working thread reads the flag from its own local stack, the flag is still false ( it makes sense since when it is copied from main memory in main thread ), so the working threads could never end. See the following picture for detail.

    Solution is: add keyword volatile to flag variable, to force the read access on it in working thread is done always from main memory, so that after the flag is changed to true in main thread, later the working thread can detect this latest change since it reads data from main memory now.
    After this keyword is added we can get expected output:

    要获取更多Jerry的原创文章,请关注公众号"汪子熙":

  • 相关阅读:
    实验4-2-4 换硬币 (20分)
    实验4-1-4 求整数的位数及各位数字之和 (15分)
    实验4-1-10 兔子繁衍问题 (15分)
    实验4-1-7 特殊a串数列求和 (20分)
    实验4-1-3 找出最小值 (20分)
    实验4-1-2 求奇数和 (15分)
    实验4-1-1 最大公约数和最小公倍数 (15分)emmm辗转相除法
    实验3-10 高速公路超速处罚 (15分)
    1.使用Lucene开发自己的搜索引擎--倒排索引基础知识
    办公自动化项目从无到有-第三篇系统管理模块
  • 原文地址:https://www.cnblogs.com/sap-jerry/p/13540919.html
Copyright © 2011-2022 走看看