java volatile关键字
volatile 是 Java 中用于保证多线程环境下变量可见性和禁止指令重排序的关键字。
普通变量不加volatile修饰有可见性问题,即有线程修改该变量值,其他线程无法立即感知该变量值修改了。代码:
private static int intVal = 0; // 普通变量未加 volatile修饰static void testVolatile() {// 线程1检测intVal值变化new Thread(() -> {while (intVal == 0) { // 可能永远无法检测到 intVal 变为 1// 空循环}System.out.println("线程1检测到intVal已修改");}).start();// 线程2修改intVal值new Thread(() -> {try {Thread.sleep(100); // 模拟延迟} catch (InterruptedException e) {}intVal = 1; // 修改 flagSystem.out.println("线程2已设置 intVal = 1");}).start();}
打印:
发现线程1一直在循环,没有感知到变量值变化。
而加上volatile修饰后:
private static volatile int intVal = 0; // 该变量加上volatile 修饰
// 其他代码不变 。。。
打印:
可以看到,线程2修改该变量值后,线程1立即就感知到该变量值变化,没有任何的延迟。
注意:volatile是轻量级同步工具,适用于单变量状态标记。 但不能保证复合操作(如自增)的原子性,需结合同步机制或原子类使用。