码迷,mamicode.com
首页 > 其他好文 > 详细

volatile关键字(1)

时间:2019-10-26 23:26:44      阅读:166      评论:0      收藏:0      [点我收藏+]

标签:通知   高速缓存   存在   private   ini   div   效率   idt   update   

直接看代码

private static int INIT_VALUE = 0;
    private static int MAX_VALUE = 5;
    public static void main(String[] args) {
        //读线程
        new Thread(() -> {
            int localVal = INIT_VALUE;
            while (localVal < MAX_VALUE) {
                //localVal 无法感知到 INIT_VALUE的变化
                if (localVal != INIT_VALUE) {
                    System.out.printf("the value updated to [%d]\n", INIT_VALUE);
                    localVal = INIT_VALUE;
                    INIT_VALUE = localVal;
                }
            }
        }, "READ").start();

        //写线程
        new Thread(() -> {
            int localVal = INIT_VALUE;
            while (localVal < MAX_VALUE) {
                try {
                    System.out.printf("updated value to [%d]\n", ++localVal);
                    INIT_VALUE = localVal;
                    Thread.sleep(150);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        }, "UPDATER").start();

    }

输出结果

updated value to [1]
updated value to [2]
updated value to [3]
updated value to [4]
updated value to [5]

读线程无法感知 INIT_VALUE的变化

原因是因为JVM内存模型

技术图片

 

CPU会将内存中的数据存入Cache中,写线程只对“自己”的Cache做修改操作,而读线程无法感知

 

现代操作系统对这种问题的解决方案大致可以分为以下两种:

  1.数据总线加锁

    缺点就是多核CPU串行化运行,效率低。

    总线(数据总线,地址总线,控制总线)

  2.cpu高速缓存一致性协议

    1.当cpu写入数据,如果该变量被共享(也就是说在其他cpu中也存在该变量的副本),会发出信号,通知其他cpu该变量缓存无效

    2.当其他cpu访问该变量,重新到主内存中获取

 

volatile关键字(1)

标签:通知   高速缓存   存在   private   ini   div   效率   idt   update   

原文地址:https://www.cnblogs.com/MadYanYan/p/11729060.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!