Java 还提供了另一个关键字,用来并发访问数据——volatile。这个关键字指明,应用代码使用字段或变量前,必须重新从主内存读取值。同样,修改使用 volatile 修饰的值后,在写入变量之后,必须存回主内存。
volatile 关键字的主要用途之一是在“关闭前一直运行”模式中使用。编写多线程程序时,如果外部用户或系统需要向处理中的线程发出信号,告诉线程在完成当前作业后优雅关闭线程,那么就要使用volatile。这个过程有时叫作“优雅结束”模式。下面看个典型示例,假设处理中的线程里有下述代码,而这段代码在一个实现 Runnable 接口的类中定义:
private volatile boolean shutdown = false;
public void shutdown() {
shutdown = true;
}
public void run() {
while (!shutdown) {
// ……处理其他任务
}
}
只要没有其他线程调用 shutdown() 方法,处理中的线程就会继续处理任务(经常和非常有用的 BlockingQueue 一起使用,BlockingQueue 接口用于分配工作)。一旦有其他线程调用 shutdown() 方法,处理中的线程就会发现 shutdown 的值变成了 true。这个变化并不影响运行中的作业,不过一旦这个任务结束,处理中的线程就不会再接受其他任务,而会优雅关闭。