Java volatile关键字详解

好嘞!各位观众老爷们,欢迎来到“Java并发那些事儿”专场!今天咱们要聊的,可不是那种让人昏昏欲睡的并发理论,而是实实在在、能让你代码跑得飞起的volatile关键字!准备好了吗?让我们一起揭开volatile的神秘面纱,看看它到底是个什么“妖孽”!😎

开场白:并发的爱恨情仇

在多线程的世界里,并发就像一把双刃剑。用好了,程序效率噌噌往上涨,CPU火力全开,性能杠杠的!用不好,那就等着被各种线程安全问题折磨吧!什么数据不一致、死锁、活锁,分分钟让你怀疑人生。

想象一下,你和你的小伙伴同时修改同一份文档,如果没有协调机制,结果会怎样?要么你覆盖了他的修改,要么他覆盖了你的,最终文档内容变得一塌糊涂,谁也说不清哪个版本是正确的。这就是并发带来的问题,就好比一群熊孩子在同一个房间里抢玩具,不打起来才怪!

而Java并发编程,就像驯服这些熊孩子,让它们乖乖地共享资源,和谐共处。volatile关键字,就是我们驯服它们的一件利器!

第一幕:内存模型是个啥?(Memory Model)

要想理解volatile,就必须先搞清楚Java内存模型(Java Memory Model,简称JMM)。别怕,这玩意儿听起来高大上,其实也没那么玄乎。

你可以把JMM想象成一个大舞台,每个线程都是一个演员,CPU是舞台灯光师,而内存就是舞台的背景。

  • 主内存(Main Memory): 这是舞台的背景,所有演员共享的道具都放在这里。可以理解为所有线程共享的内存区域,存储着共享变量。
  • 工作内存(Working Memory): 这是演员的化妆间,每个演员都有自己的化妆间,里面放着他们需要使用的道具的副本。每个线程都有自己的工作内存,存储着主内存中共享变量的副本。

演员要用道具,不能直接从舞台背景拿,必须先从舞台背景复制一份到自己的化妆间,用完了再把修改后的道具放回舞台背景。

问题来了: 演员们各自在化妆间里修改道具,然后才放回舞台背景,这期间舞台背景上的道具还是旧的!如果另一个演员也需要用到这个道具,并且是从旧的舞台背景上复制的,那么他用的就是过时的数据!

这就像一个简单的银行账户:

  1. 线程A从主内存中读取账户余额(假设是100元)到自己的工作内存。
  2. 线程B也从主内存中读取账户余额(也是100元)到自己的工作内存。
  3. 线程A在自己的工作内存中给账户存入50元,账户余额变为150元,然后将150元写回主内存。
  4. 线程B在自己的工作内存中给账户取出20元,账户余额变为80元,然后将80元写回主内存。

最终,主内存中的账户余额是多少?80元?150元?都有可能!这完全取决于线程A和线程B谁先写回主内存。这种情况,我们就称之为数据不一致

第二幕:volatile闪亮登场!

volatile关键字的作用,就像给舞台背景加了一个“实时同步”的魔法。它告诉JVM:

  • “注意啦!这个变量很敏感,任何线程修改了它,必须立刻同步到主内存!”
  • “任何线程要读取这个变量,必须从主内存中读取最新的值!”

这样一来,演员们就不能各自为政,必须时刻关注舞台背景上的道具变化,确保自己使用的都是最新的数据。

换句话说,volatile保证了可见性

举个栗子:

public class VolatileExample {
    private volatile boolean running = true;

    public void start() {
        new Thread(() -> {
            while (running) {
                // do something
                System.out.println("Thread is running...");
                try {
                    Thread.sleep(100);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
            System.out.println("Thread stopped.");
        }).start();
    }

    public void stop() {
        running = false;
    }

    public static void main(String[] args) throws InterruptedException {
        VolatileExample example = new VolatileExample();
        example.start();

        Thread.sleep(1000); // 让线程跑一会儿
        example.stop(); // 停止线程
    }
}

在这个例子中,running变量被声明为volatile。如果没有volatilestop()方法修改了running的值,线程可能不会立即停止,因为它可能还在使用自己工作内存中的旧值。加上volatile之后,stop()方法修改running的值后,线程会立即从主内存中读取最新的running值,从而停止循环。

第三幕:volatile的特性:可见性与有序性

volatile主要有两个特性:

  • 可见性(Visibility): 保证了所有线程对volatile变量的读写操作都是“可见”的,即任何线程修改了volatile变量的值,其他线程都能立即看到最新的值。
  • 有序性(Ordering): 禁止指令重排序优化。

指令重排序?

为了提高程序运行效率,编译器和处理器可能会对指令进行重排序。比如:

int a = 1; // 语句1
int b = 2; // 语句2
int c = a + b; // 语句3

编译器可能会将语句1和语句2的顺序调换,因为它们之间没有依赖关系。这样做在单线程环境下没有任何问题,但是在多线程环境下,可能会导致意想不到的结果。

volatile通过插入内存屏障(Memory Barrier)来禁止指令重排序优化,保证了代码的执行顺序按照程序员的意愿进行。

第四幕:volatile适用场景

volatile虽然强大,但也不是万能的。它只能保证单个volatile变量的原子性操作。

啥是原子性?

原子性是指一个操作是不可中断的,要么全部执行成功,要么全部执行失败。就像一个事务,要么全部提交,要么全部回滚。

volatile能保证对volatile变量的操作和操作的原子性,但是不能保证复合操作的原子性。

举个反例:

public class VolatileCounter {
    private volatile int count = 0;

    public void increment() {
        count++; // 这不是原子操作!
    }

    public int getCount() {
        return count;
    }

    public static void main(String[] args) throws InterruptedException {
        VolatileCounter counter = new VolatileCounter();
        Thread[] threads = new Thread[10];

        for (int i = 0; i < 10; i++) {
            threads[i] = new Thread(() -> {
                for (int j = 0; j < 1000; j++) {
                    counter.increment();
                }
            });
            threads[i].start();
        }

        for (Thread thread : threads) {
            thread.join();
        }

        System.out.println("Count: " + counter.getCount()); // 结果可能小于10000
    }
}

在这个例子中,count++操作实际上包含了三个步骤:

  1. 读取count的值。
  2. count的值加1。
  3. 将加1后的值写回count

这三个步骤不是原子操作,所以在多线程环境下,可能会出现线程A读取了count的值,然后线程B也读取了count的值,线程A将count的值加1并写回,线程B也将count的值加1并写回,最终count的值只增加了1,而不是2。

所以,volatile适用于以下场景:

  • 状态标记量: 就像我们之前的例子,用volatile标记一个running变量,用于控制线程的运行状态。
  • 一次性安全发布: 当某个对象只需要被初始化一次,并且初始化完成后就可以被多个线程安全地访问时,可以使用volatile

第五幕:volatile vs synchronized

volatilesynchronized都是Java并发编程中常用的关键字,但它们的作用和适用场景却大相径庭。

| 特性 | volatile | synchronized |
| ———- | ————————————————————————————————————————————————————————— | ————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————0. 线程封闭(Thread confinement):如果使用ThreadLocal,它会在每个线程中创建变量的副本,相当于每个线程有自己的私有变量,天然线程安全。

  1. 数据不可变(Immutability):将对象设计为不可变对象,例如String,Integer等,不可变对象天生就是线程安全的
  2. 原子类(Atomic Class):java.util.concurrent.atomic包下提供了一些原子类,例如AtomicInteger,AtomicLong等,它们使用CAS等技术保证了原子性操作。

第六幕:总结:volatile的正确打开方式

volatile是一个简单而强大的关键字,用得好能让你的代码更高效,用不好就可能带来难以调试的问题。记住,volatile不是万能的,它只能保证可见性和有序性,不能保证原子性。

什么时候用volatile

  • 当多个线程需要读取同一个变量,并且其中一个线程可能会修改这个变量的值时,可以使用volatile来保证可见性。
  • 当需要禁止指令重排序优化时,可以使用volatile来保证有序性。

什么时候不用volatile

  • 当需要保证原子性操作时,不能使用volatile,应该使用synchronized或者原子类。
  • 当变量的值不经常变化时,使用volatile可能会带来额外的性能开销,因为每次读写都需要同步到主内存。

结尾:并发编程,任重道远

并发编程是一门复杂的艺术,需要深入理解底层原理,并根据实际情况选择合适的工具。volatile只是其中的一个工具,掌握它,能让你在并发编程的道路上更进一步!

希望今天的讲解能帮助大家更好地理解volatile关键字。下次再见!👋

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注