前言
我们知道在多线程中,对共享变量进行修改,有可能不能读到立即修改的值,但是其最多是一个失效值,而不是随机值
示例代码:
public class AA {
private int value;
public int getValue() {
return value;
}
public void setValue(int value) {
this.value = value;
}
public static void main(String[] args) throws InterruptedException {
AA a = new AA();
System.out.println(a.getValue());
new Thread(() -> System.out.println(a.getValue())).start();
Thread.sleep(1);
a.setValue(8);
System.out.println(a.getValue());
}
}
我让线程睡眠了1毫秒,模拟了一下线程切换,输出结果
0
0
8
线程读到了过期值,但是这个至少是之前线程设置的值。
但是在非 volatile 类型的 64 位数值变量中(double、long)。
Java 内存模型要求,变量的读取和写入操作必须是原子性的,但是在非 volatile 类型的 long 和 double 变量中,JVM 允许将64位的读操作和写操作分解为两个 32 为的操作。
那么你在用多线程读取时,就有可能读取到 高32位或者 低 32 位的数据。
所以在使用的时候一定要注意,要么加锁,要么使用 volatile 进行修饰。