深入理解 volatile 关键字
volatile 关键字是 Java 语言的高级特性,但要弄清楚其工作原理,需要先弄懂 Java 内
存模型。如果你之前没了解过 Java 内存模型,那可以先看看之前我写过的一篇「深入理解
Java 内存模型」一文。
初学 volatile 关键字,我们需要弄清楚它到底意味着什么。总的来说,它有两个含义,分
别是:
保证可见性
禁止指令重排序
保证可见性
保证可见性指的是:当一个线程修改了某个变量时,其他所有线程都知道该变量被修改了。
由于 volatile 可以保证可见性,因此 Java 能够保证现在在读取 volatile 变量时,线程读取
到的值是准确的。但是这并不意味着对 volatile 变量的操作是线程安全的,因为有可能在读
取到变量之后,又有其他线程对变量进行修改了。
为了说明这个问题,我们可以举个简单地例子。下面代码发起了 20 个线程,每个线程对
race 变量进行 1 万次自增操作。如果这段代码能够正确并发执行,那么最后输出的结果应
该是 20 万。但实际上,每次输出的结果都不一样,都是一个小于 20 万的数字,为什么呢?
这是因为当线程在获取到 race 变量的值,然后对其进行自增这中间,有可能其他线程对
race 变量做了自增操作,然后写回了主内存。而当前线程再将数据写回主内存时,就发生
了数据覆盖。因此,就发生了数据不一致的问题。