在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
的修改都会被立即反映到其他线程中。