在 Java 中,volatile 是一种轻量级的同步机制,主要用于保证变量的可见性和禁止指令重排序,但不保证原子性。下面从概念、用法、示例和注意事项几个方面说明。
当一个线程修改了 volatile 变量的值,其他线程立即能看到最新值。
普通变量:
volatile 变量:
volatile 写操作之前的操作不会被重排到写之后
volatile 读操作之后的操作不会被重排到读之前
常用于双重检查锁(DCL)。
public class VolatileExample {
private volatile boolean running = true;
public void start() {
new Thread(() -> {
while (running) {
// do something
}
System.out.println("线程结束");
}).start();
}
public void stop() {
running = false; // 其他线程立刻可见
}
}
volatile boolean isRunning = true;
适合:
❌ 不适合:
i++ 不是原子操作)public 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 Object config;
public void init() {
config = loadConfig(); // 发布
}
volatile int count = 0;
// 多线程执行
count++; // 非原子操作
正确方式:
AtomicInteger count = new AtomicInteger();
count.incrementAndGet();
或使用 synchronized / Lock
| 特性 | volatile | synchronized |
|---|---|---|
| 可见性 | ✅ | ✅ |
| 原子性 | ❌ | ✅ |
| 阻塞 | ❌ | ✅ |
| 性能 | 高 | 低 |
✅ 适合:
❌ 不适合:
i++)volatile = 可见性 + 有序性,但不等于线程安全
如果你愿意,我可以:
你想从哪个方向深入?
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。