volatile变量规则的直觉理解
相关概念:java
volatile 最容易让人困惑的地方,不是它“难”,而是那句规则表面上看太像一句正确但无感的话:
对一个
volatile变量的写,happens-before 于后续对这个变量的读。
最容易卡住的误解
很多人第一次看到时,会不自觉地把它理解成:
- 写线程会不会阻塞读线程?
- 读线程是不是一定要等写线程完成?
其实不是这个意思。
直觉理解
如果把注意力放回 JMM,会更容易理解:
- 普通变量的修改,可能长时间只停留在工作内存里
volatile变量的修改,会更快以“对其他线程可见”的方式传播出去
所以这条规则真正重要的不是“谁先执行代码”,而是:
这个写入对后续读取是否建立了可见性。
为什么单靠代码顺序理解不够
因为代码里看到的“一个变量”,在底层未必只有一份:
- 主内存里有一份
- CPU 缓存里可能有一份
- 寄存器里还可能临时有一份
如果只盯着源码里的那个变量名看,很容易把问题看扁。
记忆方式
volatile 可以先粗略记成一句话:
它首先解决的是“别的线程能不能及时看到这个值变了”。
至于内存屏障、重排序约束这些,是下一层实现原理。
边界
volatile 很重要,但它解决不了所有并发问题。
它更适合:
- 状态标志位
- 一次写、多次读
- 不依赖复合原子性的场景
如果涉及“读改写”一整套复合操作,单靠 volatile 就不够了。