volatile关键字

Posted madyanyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了volatile关键字相关的知识,希望对你有一定的参考价值。

直接看代码

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]
", 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]
", ++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关键字的主要内容,如果未能解决你的问题,请参考以下文章

深度解析volatile关键字(保证够全面)❤❤

java volatile关键字

volatile关键字是什么意思

Java volatile关键字解惑

C语言 volatile 关键字在编译优化过程中有何作用

volatile关键字是不是能保证线程安全