好的,我来帮你整理一份 Java 中 volatile
关键字详解,从概念、原理、使用场景到注意事项,深入讲解并配示例代码。
volatile
简介synchronized
的场景volatile
的核心特性volatile
变量,立即对其他线程可见volatile
会在 读/写操作前后加入内存屏障(Memory Barrier),保证顺序count++
等操作不是原子操作class Task implements Runnable {
private volatile boolean running = true;
public void stop() {
running = false;
}
@Override
public void run() {
while (running) {
// 执行任务
}
System.out.println("线程已停止");
}
}
running
,其他线程可以立即感知public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
volatile
防止 对象未完全初始化就被其他线程访问volatile
与 Java 内存模型(JMM) 密切相关volatile
变量class VolatileDemo {
private static volatile boolean flag = true;
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
while (flag) {
// 循环等待 flag 变为 false
}
System.out.println("线程结束");
}).start();
Thread.sleep(1000);
flag = false; // 主线程修改 flag
System.out.println("主线程修改 flag");
}
}
volatile
,子线程可能 永远循环volatile
,子线程能及时感知变化volatile int count = 0;
count++; // 不安全,可能丢失更新
synchronized
或 AtomicInteger
volatile
是 轻量级同步工具,主要解决 可见性和顺序问题AtomicXXX
或 synchronized
如果你愿意,我可以帮你画一张 volatile
内存可见性与指令重排示意图,让多线程概念更直观易懂。
你希望我画吗?
https://www.52runoob.com/archives/6675
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。