![](https://i-blog.csdnimg.cn/direct/0bb4711277ee4800b77ee2c822338650.png)
一、volatile 简介
1.1 定义
volatile
关键字可以用于修饰我们之前说的共享变量(主内存中存储的对象、成员变量、数组等)。
一旦共享变量被 volatile 修饰后,就具备了两层含义:
- 保证线程间的可见性。
- 禁止指令重排序。
1.2 volatile 的两个特性
特性1:保证线程间的可见性
- 用 volatile 修饰共享变量,能够防止编译器等优化发生,让一个线程修改共享变量的同时对另一个线程可见。
特性2:禁止指令重排序
- 用 volatile 修饰的共享变量,会在读/写共享变量时,加入不同的屏障,阻止其它读写操作越过屏障,从而达到阻止指令重排序的效果。
二、特性1:保证线程间的可见性
- 用 volatile 修饰共享变量,能够防止编译器等优化发生,让一个线程修改共享变量的同时对另一个线程可见。
示例1:普通场景
1)代码示例:
例如下面这段代码:
private static boolean stop = false;
public static void main(String[] args) {
// 线程1
new Thread(() -> {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
stop = true;
System.out.println(Thread.currentThread().getName() + ": modify stop to true...");
}, "t1").start();
// 线程2
new Thread(() -> {
try {
System.out.println(Thread.currentThread().getName() + ": " + stop);
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName