【118、volatile 有什么用?】

140 阅读1分钟

volatile 是 Java 中的关键字,用于修饰变量,其主要作用是保证变量在多线程环境中的可见性和禁止指令重排优化。

  1. 可见性

在多线程环境下,不同线程对同一个变量进行读写操作时,由于每个线程有自己的线程本地内存,这可能会导致变量值在不同线程之间不可见。使用 volatile 关键字修饰变量可以保证变量对于所有线程的可见性,即任何线程对变量的修改都可以立即被其他线程看到,从而避免了数据的不一致和错误。

  1. 禁止指令重排

指令重排是指 CPU 在执行指令时可能会按照一定的规则进行指令顺序的调整,以提高代码执行效率。在单线程环境下,这种优化是没有问题的。但是,在多线程环境下,由于不同线程之间的操作是不可预测的,指令重排可能会导致线程执行的结果与预期不一致。使用 volatile 关键字可以禁止指令重排,从而保证程序的正确性。

需要注意的是,volatile 不能保证原子性,即不能保证复合操作的原子性。如果需要保证原子性,可以考虑使用 synchronized 或者 Lock 等同步机制来进行控制。

总的来说,volatile 关键字在多线程编程中非常重要,可以用来保证变量的可见性和禁止指令重排,但是需要注意其并不能保证原子性。