volatile是一个类型(type specifier),就像大家更熟悉的const一样,它是被设计用来修饰被不同线程访问和修改的变量。
volatile的作用是作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值。
volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。
使用volatile 也可以达到 终止线程结束的目的。但是这个要比设置标识符更加精确。
使用的volatile 例子如下所示:
先写一个线程:
StopThread 里面使用 volatile 修饰一个 标识符 flag。
class StopThread extends Thread{
volatile boolean flag=true;
@Override
public void run() {
while(flag){
System.out.println("子线程在输出");
}
System.out.println("StopThread子线程结束");
}
}
接下来编写一个测试类:
public class TestVolatile {
public static void main(String[] args) throws IOException {
StopThread stopThread=new StopThread();
stopThread.start();
System.out.println("任意输入字符终止StopThread:");
System.in.read();
stopThread.flag=false;
System.out.println("主线程结束");
}
}
运行测试类 :
输出结果如下所示:

image.png
子线程一直不断输出 ,直到主线程输入任意字符 改变 volatile 修饰的标识符