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

Posted 阿里-马云的学习笔记

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了单例模式-----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;
    }

}

以上是关于单例模式-----java实现的主要内容,如果未能解决你的问题,请参考以下文章

设计模式之单例模式

两种实现单例模式的方式

(转)你真的会写单例模式吗——Java实现

java的单例模式怎么能保证始终是单例

Java单例模式

设计模式之单例模式(Java实现)