简单回答:volatile 不保证线程安全,它只解决可见性和禁止指令重排序,不保证原子性。
下面分点说明。
volatile 能做什么一个线程修改了 volatile 变量,其他线程立刻能看到最新值。
volatile boolean flag = false;
// 线程A
flag = true;
// 线程B
while (!flag) {
// 不会一直读旧值
}
常用于**双重检查锁(DCL)**的单例模式。
private static volatile Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
volatile 不能做什么典型反例:i++
volatile int i = 0;
// 多线程执行
i++; // 非原子操作
i++ 实际是:
多个线程可能同时读到相同值,导致丢失更新。
volatile 是“线程安全”的?只有在以下场景才是安全的:
✅ 单个变量的读写是原子的(如 boolean、int 赋值)
✅ 不依赖当前值做复合操作
例如:
volatile boolean stopped = false;
void stop() {
stopped = true; // 安全
}
| 场景 | 正确方式 |
|---|---|
| 计数器 | AtomicInteger |
| 复合操作 | synchronized / Lock |
| 高并发累加 | LongAdder |
| 状态标志 | volatile(够用) |
volatile≠ 线程安全
它只保证“看得见”,不保证“算得对”。
如果你是准备面试或想看具体并发场景分析,我可以继续展开。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。