Java多线程 可见性问题出现的原因

可见性问题出现的原因

主要的原因可以从下图中分析出来.
此图中, 最下层为ram, 也就是内存, 而内存离CPU之间 ,是有多级的缓存的.
L3 cache为内存的一部分, 会把内存中高频用到的部分缓存起来.
L2 cache为L3 cache的一部分, 会把L3 cache高频用到的部分缓存起来.
L1 cache为L2 cache的一部分, 会把L2 cache高频用到的部分缓存起来.
每一层缓存的大小在缩小, 但读取速度在不断的增加.
到了Register 是寄存器, 速度最快, CPU从寄存器中拿数值.

如果不经过这些缓存, 而是直接从ram中拿数据的话, 会极大的降低CPU的运行效率.
但正是由于不是拿的主存中的数据, 就会出现可见性的问题.

从Windows10的任务管理器中, 也可以看到L1 L2 L3级缓存, 并且其大小是从小到大的.

不同的处理器, 可能缓存层级少一些, 几乎不可能出现可见性问题, 但可能有的处理器缓存的层级多, 并且可能不去同步主内存中最新的值.
而JMM给出的规范就是, 规定在何时一定要去主内存中同步数据, 获取最新的数据,

完整的文字总结:


猜你喜欢

转载自blog.csdn.net/qq_33229669/article/details/108421939
今日推荐