单例模式-----java实现

单例模式使用非常的广泛,那么你会使用哪几种方式去实现呢?

双重锁检查

/**
 * 懒汉式-双重检查
 */
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;
    }

}
原文地址:https://www.cnblogs.com/alimayun/p/12174092.html