在 Java 中,volatile 是一个轻量级的同步机制,主要用于保证可见性和有序性,但不保证原子性。下面从原理层面系统说明。
在多线程环境下,存在两个核心问题:
volatile 就是用来解决这两个问题的。
volatile 修饰的变量:
✅ 结果:一个线程改了,其他线程立刻可见
通过 内存屏障(Memory Barrier)
对一个 volatile 变量的写操作
happens-before 后续对这个变量的读操作
写 volatile:
普通写
StoreStore 屏障
写 volatile
StoreLoad 屏障
读 volatile:
读 volatile
LoadLoad 屏障
LoadStore 屏障
普通读
✅ 防止重排序,保证执行顺序
volatile int count = 0;
count++; // 非原子操作
count++ 实际是:
多个线程同时执行时,仍可能丢失更新。
✅ 解决方案:
synchronizedAtomicIntegervolatile boolean running = true;
void run() {
while (running) {
// do something
}
}
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 | synchronized |
|---|---|---|
| 可见性 | ✅ | ✅ |
| 有序性 | ✅ | ✅ |
| 原子性 | ❌ | ✅ |
| 阻塞 | ❌ | ✅ |
| 性能 | 高 | 低 |
volatile 通过内存屏障和缓存一致性协议,保证变量的可见性和有序性,但不保证原子性,是一种轻量级但有限的线程安全机制。
如果你愿意,我也可以:
volatile 和 Atomic 的实现原理免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。