并发值 有序性、可见性、原子性

Java 并发编程:volatile的使用及其原理
【并发编程】MESI--CPU缓存一致性协议
<!-- more -->

volatile: 有序性、可见性

有序性----指令重排序

volatile 防止指令重排序

对象构造的流程

  1. 分配内存空间
  2. 初始化对象
  3. 将内存空间的地址赋值给对应的引用

但是由于操作系统可以对指令进行重排序,所以构造流程可能变成

  1. 分配内存空间
  2. 将内存空间的地址赋值给对应的引用
  3. 初始化对象

如果是上面这个流程,在多线程情况下,可能将一个未初始化的对象引用暴露出来,导致

以下面这单例模式-双重检查锁为例说明

//// 双重检查加锁
public class DoubleCheckSingleton{
    // volatile 防止指令重排序
    public static volatile DoubleCheckSingleton doubleCheckSingleton;
    // 私有构造函数,禁止外部实例化
    private DoubleCheckSingleton(){};
    public static DoubleCheckSingleton getInstance() {
        if(doubleCheckSingleton == null) {
            synchronized(doubleCheckSingleton) {
                if(doubleCheckSingleton == null) {
                    doubleCheckSingleton = new DoubleCheckSingleton;();
                }
            }
        }
        return doubleCheckSingleton;
    }
    
}

可见性----MESI(伊利诺伊州协议)

cas: 原子性