单例模式使用非常的广泛,那么你会使用哪几种方式去实现呢?
双重锁检查
/** * 懒汉式-双重检查 */ public class SingleDcl { //一定要使用volatile关键字。 private volatile static SingleDcl singleDcl; private SingleDcl(){ } public static SingleDcl getInstance(){ if(singleDcl==null) { synchronized (SingleDcl.class) {//类锁 if(singleDcl==null) { /**如果不使用volatile关键字,这时候判断singleDcl不为null,但是new SingleDcl()不是原子的 *可能先将内存中的某块空间分给这个对象,并给与一个地址,但是此时对象并没有完全初始化好 *比如构造器中的初始化内容较多等等,当然还涉及到指令重排序等等原因。导致报空指针 */ singleDcl = new SingleDcl(); } } } return singleDcl; } }
饿汉式
package com.xiangxue.ch7.dcl; /** * @author Mark老师 享学课堂 https://enjoy.ke.qq.com * 饿汉式 */ public class SingleEHan { public static SingleEHan singleEHan = new SingleEHan(); private SingleEHan(){} }
懒汉式-----静态内部类
package com.xiangxue.ch7.dcl; /** * 懒汉式-类初始化模式 */ public class SingleInit { private SingleInit(){} //定义一个私有类,来持有当前类的实例 private static class InstanceHolder{ public static SingleInit instance = new SingleInit(); } public static SingleInit getInstance(){ //当调用此方法时,InstanceHolder类才开始初始化,因为使用了其static变量,此时才会实例化SingleInit对象 return InstanceHolder.instance; } }