设计模式-单例模式

单例模式几乎是所有程序员最早接触的设计模式,它的目的是保证一个应用中某个对象的唯一性,单例模式也有很多种写法,接下来我们就来看一下单例模式的几种实现。

一、饿汉模式

public class Singleton {
    private static final Singleton instance = new Singleton();
    private Singleton(){}

    public static Singleton getInstance(){
        
        return instance;
    }
}

此种方法可以保证每次返回的instance是同一个对象,但是缺点是instance是静态的程序启动是就会创建instance对象,占用内存,为了优化这个缺点,我们看下懒汉模式

二、懒汉模式

public class Singleton {
    private static Singleton instance ;
    private Singleton(){}

    public static synchronized Singleton getInstance(){
        if (null == instance){
            instance = new Singleton();
        }
        return instance;
    }
}

懒汉模式优点是在方法被调用时才创建对象,节省了内存,缺点是每次调用方法都会执行同步关键字,耗费cpu资源。因此出现了第三种写法DCL模式

三、DCL(double check lock)

public class Singleton {
    private static Singleton instance ;
    private Singleton(){}

    public static synchronized Singleton getInstance(){
        if (null == instance){
            synchronized (Singleton.class){
                if (null==instance){
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

此写法具有上述三种写法的全部有点,且不会每次调用都依赖同步关键字,不存在CPU资源的不必要消耗。此模式下对instance进行了两次null的判断,看起来有点多此一举,其实这是java编译器的执行有关,instance = new Singleton();并不是一个原子操作,会编译为3条汇编指令。而java编译器又是允许处理器乱序执行的,也就是这三条指令的执行循序不固定,因此会出现线程不安全情况,需要进行两次判断,具体原因不详细解释。

四、静态类模式

public class Singleton {
    private static Singleton instance ;
    private Singleton(){}

    public static Singleton getInstance(){

        return SingletonHolder.instance;
    }

    private static class SingletonHolder{
        public static final Singleton instance = new Singleton();
    }
}

DCL模式虽然解决了资源消耗,多余同步,线程安全等问题,但是他在某些情况下还是会失效,这个问题又被成为多重检查失效问题,具体原因有兴趣的同学可以查一下。所以在平时开发中静态类模式是最常用的模式

最后,单例模式当然还有别的写法入‘枚举模式’,但是不太常用,在此就不做介绍了,本文如有错误,请大家指正!!!

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值