zoukankan      html  css  js  c++  java
  • 一个解释volatile关键字最好的例子

    小例子

    public class VolatileTest {
        private static volatile int INIT_VALUE = 0;
        private final static  int MAX_VALUE = 5;
        
        public static void main(String[] args) {
            // 读线程
            new Thread(()->{
                int localValue = INIT_VALUE;
                while (localValue < MAX_VALUE){
                    if (localValue != INIT_VALUE){
                        System.out.println("The value update to 	" + INIT_VALUE);
                        localValue = INIT_VALUE;
                    }
    
                }
            }, "reader").start();
    
            // 更新线程
            new Thread(()->{
                int localValue = INIT_VALUE;
                while (localValue < MAX_VALUE){
                    System.out.println("update value update to 	" + (++localValue));
                    INIT_VALUE = localValue;
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }, "update").start();
        }
    }

    输出结果:

     若是不加volatile关键字呢?

    package wangwenjun.phase2.chapter03;
    
    import java.util.concurrent.TimeUnit;
    
    public class VolatileTest {
        private static int INIT_VALUE = 0;
        private final static  int MAX_VALUE = 5;
    
        public static void main(String[] args) {
            // 读线程
            new Thread(()->{
                try {
                    TimeUnit.SECONDS.sleep(1);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                int localValue = INIT_VALUE;
                while (localValue < MAX_VALUE){
                    if (localValue != INIT_VALUE){
                        System.out.println("The value update to 	" + INIT_VALUE);
                        localValue = INIT_VALUE;
                    }
    
                }
            }, "reader").start();
    
            // 更新线程
            new Thread(()->{
                int localValue = INIT_VALUE;
                while (localValue < MAX_VALUE){
                    System.out.println("update value update to 	" + (++localValue));
                    INIT_VALUE = localValue;
                    try {
                        TimeUnit.SECONDS.sleep(1);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }, "update").start();
        }
    }

     

    输出结果:

  • 相关阅读:
    solr总结
    jeesite
    Freemarker模板的使用简介
    Sd
    Sd
    Sd
    Standard Java集合类问题待整理
    Standard
    Linux并发服务器设计
    Java 生产者消费者 & 例题
  • 原文地址:https://www.cnblogs.com/ch-forever/p/10752637.html
Copyright © 2011-2022 走看看