Java并发12:volatile关键字深度解析 - 轻量级同步机制
引言:volatile能解决什么问题? 看这个经典的"停止线程"问题: public class StopThread { private boolean stop = false; // 没有volatile public void run() { new Thread(() -> { while (!stop) { // 执行任务 doWork(); } System.out.println("线程停止"); }).start(); // 1秒后停止线程 Thread.sleep(1000); stop = true; System.out.println("已设置stop=true"); } } 运行结果: 已设置stop=true (线程永远不会停止!) 加上volatile后: private volatile boolean stop = false; // 加volatile 运行结果: 已设置stop=true 线程停止 ← 正常停止了 三个问题: 为什么没有volatile时线程看不到stop = true? volatile做了什么让线程能看到了? volatile是万能的吗?什么时候不能用? 本篇文章将深入volatile的底层原理,彻底理解这个轻量级同步机制。 一、volatile解决的两大问题 1.1 可见性问题 问题根源:CPU缓存 CPU 0 CPU 1 ↓ ↓ L1 Cache (stop=false) L1 Cache (stop=false) ↓ ↓ 主内存 (stop=false) 时刻1: CPU 0修改stop=true CPU 0: L1 Cache (stop=true) ← 只在CPU 0的缓存中 CPU 1: L1 Cache (stop=false) ← CPU 1看不到! volatile的解决方案: ...