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