• 一个解释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();
        }
    }

     

    输出结果:

  • 相关阅读:
    修改UISearchBar的Cancel按钮为中文等本地化问题
    Xcode6 运行程序后,右侧Debug区域的Memory显示空白解决方法
    vuec常用插件
    clipboard 实现复制
    vue 表单操作
    vue 常用功能和命令
    关闭警告&关闭eslint
    vue 添加 fastclick的支持
    url编码函数encodeURI和encodeURIComponent
    jsencrypt加解密 &&cryptico
  • 原文地址:https://www.cnblogs.com/ch-forever/p/10752637.html
Copyright © 2020-2023  润新知