为了深入理解volatile的作用,我们需要先认识*CPU的缓存模型*。(参考https://blog.csdn.net/chenxiaoti/article/details/82776128)
由于CPU缓存模型的存在导致了以下两个问题:
1、缓存一致性问题: 当多个处理器的运算任务都涉及同一块主内存区域时,将可能导致各自的缓存数据不一致的情况,如果真的发生这种情况,需要各个处理器访问缓存时都遵循一些协议,在读写时要根据协议来进行操作,这类协议有MSI、MESI等。
2、指令重排序问题: 为了使得处理器内部的运算单元能尽量被充分利用,处理器可能会对输入代码进行乱序执行(Out-Of-Order Execution)优化,处理器会在计算之后将乱序执行的结果重组,保证该结果与顺序执行的结果是一致的,但并不保证程序中各个语句计算的先后顺序与输入代码中的顺序一致。
因此我们在读取某个变量的值时可能会出现不是我们想要的值的情况。volatile关键字可以用来解决上述问题。
**volatile具有下列两层语义:
1、保证了不同线程对这个变量进行读取时的可见性, 即一个线程修改了某个变量的值, 这新值对其他线程来说是立即可见的。 (volatile 解决了线程间共享变量的可见性问题)。
2、禁止进行指令重排序, 阻止编译器对代码的优化。