在Java中,volatile 是一个关键字,用于声明一个变量是"可见的"。当一个变量被声明为 volatile 时,它保证了线程之间的可见性,即一个线程对该变量的修改对其他线程是可见的。
主要特性包括:
可见性: 当一个线程修改一个
volatile变量的值时,这个变化会立即被其他线程所感知。这是因为volatile变量会告诉编译器和运行时系统,它的值可能会在任何时刻被其他线程修改,因此每次使用它时都应该从主内存中重新读取。禁止指令重排序:
volatile还禁止了编译器对被标记变量进行指令重排序的优化。这意味着volatile变量的读写操作不能被重排序,确保了操作的有序性。
虽然 volatile 提供了可见性的保证,但它并不能解决所有多线程并发问题。例如,它无法保证原子性,如果多个线程同时对一个 volatile 变量进行读取-修改-写入的复合操作,仍然可能引发竞态条件。
下面是一个简单的例子,展示了 volatile 的基本用法:
public class SharedResource {
private volatile boolean flag = false;
public void setFlagTrue() {
flag = true;
}
public boolean getFlag() {
return flag;
}
}
在这个例子中,flag 被声明为 volatile,保证了在多线程环境下的可见性。其他线程可以通过调用 setFlagTrue() 方法来修改 flag 的值,而通过调用 getFlag() 方法来读取 flag 的值。这样,任何一个线程对 flag 的修改都会被立即反映到其他线程中。