volatile
是Java中的关键字,用于修饰变量。使用 volatile
关键字修饰的变量具有以下两个特性:
-
可见性(Visibility): 当一个线程修改了
volatile
变量的值,该变量对其他线程是可见的。这是因为被volatile
修饰的变量会在修改后立即同步到主内存,其他线程在读取这个变量时会从主内存中获取最新的值。 -
禁止指令重排序(Prevent Instruction Reordering):
volatile
变量的读写操作在指令层面上会被禁止重排序,保证了变量的有序性。
原理:
在 Java 虚拟机中,每个线程都有自己的工作内存,用于存储其正在使用的变量的副本。当一个线程修改一个变量时,它首先会在自己的工作内存中进行修改,然后将这个修改同步到主内存。其他线程在读取这个变量时,首先会从主内存中获取最新的值,然后将这个值复制到自己的工作内存中。
使用 volatile
修饰的变量,其读写操作具有特殊的语义,保证了可见性和有序性:
-
可见性: 当一个线程修改了
volatile
变量的值,这个修改会立即同步到主内存。其他线程在读取这个变量时会从主内存中获取最新的值,而不是使用自己工作内存中的副本。 -
禁止指令重排序:
volatile
变量的读写操作在指令层面上会被禁止重排序。这意味着volatile
变量的写入操作不会被重排序到其后面的读取操作之前。
用途:
-
保证变量的可见性: 当多个线程同时访问一个变量且其中一个线程对这个变量进行了修改时,
volatile
关键字保证了所有线程都能够看到变量的最新值。 -
禁止指令重排序:
volatile
关键字禁止指令重排序,确保了在多线程环境中变量操作的有序性。
注意: 虽然 volatile
提供了可见性和禁止指令重排序的特性,但它并不能保证原子性。在需要保证原子性的操作中,还需要使用其他手段,比如使用 synchronized
关键字或者 java.util.concurrent
包提供的原子类。
Was this helpful?
0 / 0