本文深入探讨 CPU 缓存、内存屏障与 volatile 关键字在并发编程中的应用。
这三者都是为了解决 '多线程下,数据不一致、执行顺序乱' 的问题。
一、CPU 缓存
在聊 volatile 和内存屏障之前,我们先来说一说 CPU 缓存 —— 因为 volatile 和内存屏障的所有设计,都是为了解决 'CPU 缓存带来的问题'。
- 多线程修改共享变量(比如 int count = 0),count 会先被加载到 CPU 缓存,CPU 修改缓存里的 count 后,不会立刻写回主内存;
- 其他线程读取 count 时,会从自己的 CPU 缓存里读,而不是主内存 —— 这就会导致:一个线程改了 count,另一个线程看不到(可见性问题);
- 甚至 CPU 会为了提升效率,打乱 '读缓存、写缓存、写主内存' 的顺序(指令重排序),导致多线程执行顺序混乱(有序性问题)。

