Java volatile关键字
2022年6月21日大约 2 分钟
volatile 关键字
volatile
是 Java 中的一个关键字,用于声明变量,表示该变量可能会被多个线程同时访问。使用 volatile 关键字修饰的变量具有以下两个特性:
- 可见性(Visibility): 当一个线程修改了 volatile 变量的值,该变量的新值会立即被其他线程看到。换句话说,对一个 volatile 变量的写操作对其他线程是可见的。
- 禁止指令重排序(Preventing Reordering): volatile 变量的读写操作会被禁止指令重排序优化,保证了变量操作的顺序性。
volatile 关键字的使用示例
public class VolatileExample {
private volatile boolean flag = false;
public void setFlag() {
flag = true;
}
public boolean isFlag() {
return flag;
}
}
在上面的示例中,flag 变量被声明为 volatile,保证了 setFlag() 方法对 flag 的写操作对其他线程可见,从而避免了线程之间的数据不一致问题。
volatile 关键字的原理
volatile
关键字的原理主要基于 CPU 缓存一致性协议和内存屏障(Memory Barrier)。当一个线程对 volatile 变量进行写操作时,它会立即将该变量的新值刷新到主内存中,并使其他线程的 CPU 缓存失效,强制它们从主内存中重新读取变量的值。这样可以确保所有线程都能看到最新的变量值,从而实现了可见性和禁止指令重排序的效果。
volatile 关键字的应用场景
volatile
关键字通常用于以下场景:
- 状态标志:用于多线程之间的状态标志,例如停止标志、触发器等。
- 双重检查锁定(Double-Checked Locking):在单例模式中,使用 volatile 关键字可以确保线程安全的同时,提高性能。
- 轻量级同步:相对于 synchronized 关键字,volatile 关键字提供了一种更轻量级的同步机制,适用于某些特定场景下的线程间通信。
原创声明
平台文章均为原创文章,未经许可,禁止转载。
如需转载,请联系作者获取授权,并注明来源及原文链接。