什么是可见性?volatile 是如何保证可见性的?

136 阅读2分钟

可见性(Visibility)在计算机科学中,特别是在并发编程和内存模型中,是一个关键概念。它指的是一个线程对共享变量的修改能够及时地被其他线程观察到。换句话说,如果一个线程修改了一个共享变量的值,其他线程应当能够看到这个修改后的值,而不是一个过时或者不一致的值。

volatile关键字在Java等编程语言中,被用来修饰变量,以确保其可见性。当一个变量被声明为volatile时,JVM(Java虚拟机)会确保所有线程看到这个变量的值是一致的。具体来说,volatile关键字提供了以下保证:

  1. 禁止指令重排:在JVM中,为了提高性能,编译器和处理器可能会对输入代码进行重排序。volatile关键字禁止了这种重排序,从而确保了操作顺序的一致性。
  2. 保证内存可见性:当一个线程修改了一个volatile变量的值,这个修改会立即同步到主内存,当有其他线程需要读取时,它会去主内存中读取新值。这就确保了每次读取的都是最新的、修改后的值。
  3. 不保证原子性:虽然volatile关键字保证了可见性和禁止指令重排,但它并不保证对volatile变量的操作是原子的。也就是说,volatile无法保证复合操作(如自增或自减)的原子性。

综上所述,volatile关键字通过禁止指令重排和保证内存可见性来确保变量的可见性。然而,它并不适用于所有并发场景,特别是需要原子性操作的场景。在这些场景中,可能需要使用其他同步机制,如synchronized关键字或java.util.concurrent库中的原子类。