volatile 了解吗

103 阅读1分钟

在Java中,volatile 是一个关键字,主要用于修饰实例变量。它的主要作用是确保多个线程能够正确地处理某个变量。

volatile 的主要特性包括:

  1. 可见性(Visibility)

    • 当一个线程修改了 volatile 变量的值时,该变量的新值对于其他线程是立即可见的。这是因为 volatile 变量会在主存和线程的工作内存之间同步,确保所有线程看到的是最新的值。
  2. 禁止指令重排序(Prevents Reordering)

    • volatile 关键字禁止了指令重排序,确保了代码的执行顺序与写入的顺序一致。
  3. 不保证原子性(Not Atomic)

    • 尽管 volatile 提供了可见性,但它并不保证对变量操作的原子性。例如,递增操作 i++ 不能保证是原子的,因为它包括读取、增加和写入三个步骤,其他线程可能在这三个步骤之间插入。

volatile 通常用于确保某个变量对所有线程的可见性,但如果需要进行更复杂的操作,例如复合操作的原子性保证,就需要考虑使用 synchronized 关键字或者 java.util.concurrent 包中提供的原子类。

示例:

public class SharedResource {
    private volatile int counter = 0;

    public int getCounter() {
        return counter;
    }

    public void increment() {
        counter++;
    }
}

在上述示例中,counter 被声明为 volatile,以确保对它的修改对其他线程是可见的。