在 Java 并发编程中,volatile 和 synchronized 都用于保证多线程环境下的可见性,但它们的作用范围、语义和能力有明显区别。
| 对比项 | volatile | synchronized |
|---|---|---|
| 原子性 | ❌ 不保证 | ✅ 保证 |
| 可见性 | ✅ 保证 | ✅ 保证 |
| 有序性 | ✅ 有限保证(禁止指令重排) | ✅ 保证 |
| 是否阻塞线程 | ❌ 不会 | ✅ 会(重量级) |
| 作用范围 | 变量 | 方法 / 代码块 |
| 使用复杂度 | 简单 | 较复杂 |
一个线程修改了 volatile 变量,其他线程立即可见。
volatile boolean flag = false;
常用于双重检查单例:
private static volatile Singleton instance;
❌ 错误示例:
volatile int count = 0;
// 多线程执行
count++;
count++ 不是原子操作,仍可能出问题。
✅ 正确做法:
AtomicInteger count = new AtomicInteger();
同一时刻只有一个线程执行同步代码。
synchronized (this) {
count++;
}
进入同步块:
退出同步块:
volatile boolean running = true;
volatile 是轻量级的“可见性工具”,synchronized 是重量级的“原子+可见+有序”锁。
如果你愿意,我也可以:
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。