正文
01 简介
在没有必要的同步的情况下,编译时、运行时,处理器可以进行各种优化。尽管这些优化在大多数情况下都是有益的,但有时它们也会导致一些奇怪的问题。缓存和重排序是在并发环境中可能会让我们特别的优化之一。Java和JVM提供了许多控制内存顺序的方法,其中的volatile关键字就是之一。
02 共享的多处理器架构
CPU负责执行程序指令。因此,他们需要从RAM中检索程序指令和所需的数据。由于cpu每秒能够执行大量的指令,从RAM获取对它们来说并不理想。为了改善这种情况,处理器正在使用乱序执行、分支预测、推测执行等技巧,当然还有缓存。
随着不同的内核执行更多的指令和操作更多的数据,它们用更多相关的数据和指令填充缓存。这将以引入缓存一致性问题为代价来提系统的高总体性能。
03 Volatile如何实现的
在一个代码程序中,这个关键字的实际作用是:内存可见性以及禁止指令重排序。但是它无法实现原子性。原理采用的是缓存一致性协议、内存屏障以及happes before规则实现的。
04 经常使用的地方
多线程并发以及 DCL 单例模式中,经常会用到这个关键字。并且在使用长类型时候也最好用它来进行修饰,例如:Long、Double等类型。