并发值 有序性、可见性、原子性
Java 并发编程:volatile的使用及其原理
【并发编程】MESI--CPU缓存一致性协议
<!-- more -->
volatile: 有序性、可见性
有序性----指令重排序
volatile 防止指令重排序
对象构造的流程
- 分配内存空间
- 初始化对象
- 将内存空间的地址赋值给对应的引用
但是由于操作系统可以对指令进行重排序,所以构造流程可能变成
- 分配内存空间
- 将内存空间的地址赋值给对应的引用
- 初始化对象
如果是上面这个流程,在多线程情况下,可能将一个未初始化的对象引用暴露出来,导致
以下面这单例模式-双重检查锁为例说明
//// 双重检查加锁
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;
}
}