一旦一个共享变量被volatile修饰,具备了两层含义
1、保证了不同进程间的可见性,即一个线程修改了该变量,那么该变量所在cpu线程缓存变量全部失效,读取缓存的数据只能去主线程去获取,这就是线程间的可见性
2、禁止对其进行重排序,也就是保证了有序性
3、并未保证原子性操作
如以下代码,被volatile修饰的变量,一个线程一旦修改其值,其他线程都能看见
/**
* @ClassName:VolatileTest
* @Author:linianest
* @CreateTime:2020/3/22 12:08
* @version:1.0
* @Description TODO: volatile关键字的使用
*/
public class VolatileTest {
private volatile static int INIT_VALUE = 0;
private final static int MAX_LIMIT = 5;
public static void main(String[] args) {
new Thread(() -> {
int localValue = INIT_VALUE;
while (localValue < MAX_LIMIT) {
if (localValue != INIT_VALUE) {
System.out.printf("The value update to [%d]\n", INIT_VALUE);
localValue = INIT_VALUE;
}
}
}, "READER").start();
new Thread(() -> {
int localValue = INIT_VALUE;
while (INIT_VALUE < MAX_LIMIT) {
System.out.printf("Update the value to [%d]\n", ++localValue);
INIT_VALUE = localValue;
try {
Thread.sleep(5_00);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}, "UPDATER").start();
}
}