📜  Java中的volatile关键字(1)

📅  最后修改于: 2023-12-03 15:16:30.616000             🧑  作者: Mango

Java中的volatile关键字

volatile 是 Java 中一个关键字,用于声明变量。它可以确保多线程之间的可见性,即各个线程之间总是能够看到共享变量的最新值。

为什么需要volatile

在多线程环境下,由于运行时系统的优化,每个线程可能会在自己的线程缓存中保存一份共享变量的拷贝,这样就可能会导致各个线程之间的共享变量不一致。如果想要确保线程之间可以看到共享变量的最新值,就需要使用volatile

volatile的特性

使用volatile声明的变量有以下特性:

  • 可见性:保证多个线程之间对该变量进行读取时都能获得该变量的最新值;
  • 不保证原子性:volatile只能保证对单次读/写的原子性,无法保证多次操作的原子性,如i++
  • 禁止指令重排序:保证指令按照程序顺序执行,避免编译器和处理器的指令重排引起的问题。
使用volatile

定义volatile变量很简单,只需要在变量声明前面加上volatile关键字即可:

public class VolatileDemo {
    private volatile int counter = 0;
    // ...
}

volatile一般用于状态标记、双重检查锁定(DCL)、计数器等场景,可以有效地保证多线程环境下的正确性。

注意事项
  • 避免对volatile变量进行复合操作,如counter++counter += 1,这些操作并不能保证原子性,需要使用AtomicInteger等原子类实现;
  • 不要过分信任volatile关键字,它并不能保证所有的线程操作都是原子性的,需要使用synchronized互斥锁等机制保证线程安全。
总结

volatile关键字是 Java 语言中保证多线程可见性的重要机制,能够有效避免多个线程之间对共享变量的不一致问题,但是在使用时需要注意其特性和注意事项。