在Java中,volatile 是一个关键字,主要用于修饰实例变量。它的主要作用是确保多个线程能够正确地处理某个变量。
volatile 的主要特性包括:
-
可见性(Visibility) :
- 当一个线程修改了
volatile变量的值时,该变量的新值对于其他线程是立即可见的。这是因为volatile变量会在主存和线程的工作内存之间同步,确保所有线程看到的是最新的值。
- 当一个线程修改了
-
禁止指令重排序(Prevents Reordering) :
volatile关键字禁止了指令重排序,确保了代码的执行顺序与写入的顺序一致。
-
不保证原子性(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,以确保对它的修改对其他线程是可见的。