在 Java 中,volatile 是一个关键字,主要用于多线程环境下的变量可见性和有序性控制。它的作用可以总结为以下几点:
当一个变量被 volatile 修饰后:
✅ 解决的是:一个线程修改,其他线程能看到
示例:
volatile boolean flag = false;
// 线程1
flag = true;
// 线程2
while (!flag) {
// 不会死循环,能看到 flag 的变化
}
volatile 会通过**内存屏障(Memory Barrier)**防止 JVM 和 CPU 对指令进行重排序。
常见应用:双重检查锁(DCL)单例模式
class Singleton {
private static volatile Singleton instance;
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
如果不加 volatile,可能出现:
volatile 不能保证复合操作的原子性
❌ 错误示例:
volatile int count = 0;
// 多线程执行
count++; // 非原子操作
count++ 包含:
需要使用:
synchronizedAtomicInteger| 特性 | volatile | synchronized |
|---|---|---|
| 可见性 | ✅ | ✅ |
| 有序性 | ✅ | ✅ |
| 原子性 | ❌ | ✅ |
| 阻塞 | ❌ | ✅ |
| 性能 | 高 | 较低 |
volatile 适合“读多写少、操作简单”的共享变量,用来保证可见性和防止重排序,但不能替代锁。
如果你愿意,我也可以结合JMM(Java内存模型)或面试角度再深入讲。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。