首页 > 其他 > 详细

volatile关键字(1)

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

直接看代码

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)

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!