标签:通知 高速缓存 存在 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访问该变量,重新到主内存中获取
标签:通知 高速缓存 存在 private ini div 效率 idt update
原文地址:https://www.cnblogs.com/MadYanYan/p/11729060.html