创建型(1)单例模式8种写法


1饿汉式(静态常量)[可用]

2、饿汉式(静态代码块)[可用]

3、懒汉式(线程不安全)[不可用]

4、懒汉式(线程安全,同步方法)[不推荐用]
方法进行同步效率太低要改进。synchronized if (singleton4 == null)
5、懒汉式(线程安全,同步代码块)[不可用]

6、双重检查[推荐用] volatile: 参考:https://www.cnblogs.com/xz816111/p/8470048.html 为了保障多线程环境下,禁止指令重排和原子可见性。

volatileif (singleton6 == null) {if (singleton6 == null) {
7、静态内部类[推荐用]

8、枚举类【可用】
https://blog.csdn.net/chenchaofuck1/article/details/51702129
疑问:# 1、双重检查为什么要加voliate =》demo 6、双重检查[推荐用]

创建型(1)单例模式8种写法 - 图1此是单例模式延迟实例化的做法,在调用的时候进行一次初始化。需要知道以下两个知识点 volatile保证内存可见性happens-before规则
代码中的volatile 关键字如果不加,在多线程时会出现问题。比如有AB两个线程,A进行到synchronized锁中(类锁),因为jvm会对代码进行编译优化,指令会出现重排序的情况。在new 时会有以下几个步骤: 1.申请内存空间, 2.初始化默认值, 3.执行构造器方法 4.连接引用和实例。其中3,4可能会发生重排序。当顺序为1243且4刚进行完(实例还未完成),B线程进行第一个非空判断uniqueinstance == null 返回false导致出错。volatile 主要的作用是禁止指令重排序,而对于可见性并无关系。知乎关于此问题的讨论https://www.zhihu.com/question/337265532