WMX · 随记
·Java· 3 分钟阅读

volatile 解决可见性,不替你完成复合操作

停止标志需要被另一个线程看到,但计数器需要防止更新丢失。这两种共享变量问题不应该使用同一个答案。

Java 系列概览:类型与值、状态与资源、边界验证
Java 系列概览:类型与值、状态与资源、边界验证 点击图片查看大图 ↗

问题从哪里出现

停止标志需要被另一个线程看到,但计数器需要防止更新丢失。这两种共享变量问题不应该使用同一个答案。

理解核心机制

volatile 提供特定的可见性和顺序保证,适合某些简单状态发布。count++ 仍包含读、计算、写,不因字段声明 volatile 而变成整体原子。

动手做一个小实验

Java 17 或更新版本;将示例保存为 Demo.java,执行 javac Demo.java 后运行 java Demo。

Java12 行 · 可横向滚动
public class Demo {
    static volatile boolean running = true;
    public static void main(String[] args) throws Exception {
        Thread worker = new Thread(() -> {
            while (running) Thread.onSpinWait();
        });
        worker.start();
        running = false;
        worker.join();
        System.out.println("stopped");
    }
}

适用边界与常见误区

示例使用忙等待仅为突出可见性,生产环境更应考虑中断、阻塞队列或等待通知,避免持续占用 CPU。

继续练习

将共享变量换成需要满足两个字段关系的状态,讨论为什么单独声明两个 volatile 不等于原子发布一个组合状态。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档