在headfirst设计模式之独一无二的对象单件模式时遇到一个有意思的名词双重检查加锁,具体如下
此是单例模式延迟实例化的做法,在调用的时候进行一次初始化。
需要知道以下两个知识点
①volatile保证内存可见性
②happens-before规则
代码中的volatile 关键字如果不加,在多线程时会出现问题。比如有AB两个线程,A进行到synchronized锁中(类锁),因为jvm会对代码进行编译优化,指令会出现重排序的情况。在new 时会有以下几个步骤:
1.申请内存空间,
2.初始化默认值,
3.执行构造器方法
4.连接引用和实例。
其中3,4可能会发生重排序。当顺序为1243且4刚进行完(实例还未完成),B线程进行第一个非空判断uniqueinstance == null 返回false导致出错。
volatile 主要的作用是禁止指令重排序,而对于可见性并无关系。
知乎关于此问题的讨论
java 单例模式中双重检查锁定 volatile 的作用
最新推荐文章于 2024-02-24 23:48:41 发布