设计模式——单例模式之“饿汉模式”与“懒汉模式”

本文介绍了设计模式中的单例模式,重点解析了饿汉模式和懒汉模式的实现及区别。饿汉模式在类加载时创建实例,线程安全但可能导致资源浪费;懒汉模式在首次调用时创建实例,线程不安全但延迟加载。在实际开发中,通常采用DCL模式以兼顾性能和资源效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  设计模式一共分为23种其中我们最常用的也是最简单的就是单例设计模式,什么是设计模式?为什么使用要使用模式?什么是单例模式?感觉所有的事情都是在我们有了疑问之后才会更加有求知欲!
  首先来说说设计模式,只是说下我个人看法,就好像我们的日常生活中的好多事物,比如建筑的风格与样式,时间的长久人们对建房子形成了一定的认识或者是探索出了规律、模式,哥特式建筑就是要包括尖形拱门、肋状拱顶与飞拱才能算是哥特式建筑,可以这种建筑的建造模式抽象出来理解为我们的设计模式,再比如冰箱的制造就是只有立式冰箱与卧式冰箱,而根据外形的不同,要使用不同的模式来制造,这样制造冰箱的模式可以理解为我们通常意义上的设计模式了,设计模式是一套被反复使用,多数人知晓的,经过分类编目的,代码设计经验的总结,主要是考虑代码的可重用性。

单例模式

为什么使用单例模式

在编写代码的过程中有些对象我们只需要一个比如:一些常用的工具类、线程池、缓存等,单例模式主要是为了避免因为创建了多个实例造成资源的浪费,且多个实例由于多次调用容易导致结果出现错误。使用单例模式能够保证整个应用中有且只有一个实例。

单例模式的创建步骤

1、私有化构造器(为了使该类中不能被其他类随意获得,随意创建该类实例)。
2、私有的静态的该类的实例。
3、公有的获得该类实例的方法。

单例模式之饿汉模式

public class SingleTon {
    //私有化构造器
    private SingleTon(){}
    //私有化静态的实例
    private static SingleTon singleTon=new SingleTon();
    //公开的静态的获得实例的方法
    public static synchronized SingleTon newInstance(){
        return singleTon;
    }
}

单例模式之懒汉模式

public class SingleTon {
    //私有化构造器
    private SingleTon(){}
    //私有化静态的实例
    private static SingleTon singleTon;
    //公开的静态的获得实例的方法
    public static synchronized SingleTon newInstance(){
        if(singleTon==null){
            singleTon=new SingleTon();
        }
        return singleTon;
    }
}

饿汉模式与懒汉模式的区别

  两者的区别从代码中就可以看出来,饿汉模式的实例是在定义时创建的,这种static的变量的直接创建会在类创建的时候创建,而懒汉模式的实例是在调用newInstance方法的时候才会被创建,因此饿汉模式在加载类时会。

区别:
饿汉模式:加载类时比较慢,但运行时比较快且线程安全
懒汉模式:加载类时比较快,但运行时比较慢,线程不安全
在编程中一般建议使用饿汉模式

实际开发中使用

  以上的饿汉模式跟懒汉模式虽然饿汉模式看起来更安全但是每次只要获取实例时就会进行同步,这也会造成资源浪费,因此在实际开发中一般DCL(Double CheckLock)方式。 

public class SingleTon {
    //私有化构造器
    private SingleTon(){}
    //私有化静态的实例
    private static SingleTon singleTon;
    //公开的静态的获得实例的方法
    public static synchronized SingleTon newInstance(){
        if(singleTon==null){
           synchronized (SingleTon.class){
            if(singleTon==null){
              singleTon=new SingleTon();
         }
        }
    }
        return singleTon;
    }
}

通过这种方式,避免了不必要的同步操作,并且只有在实例为null的时候才创建实例,节约了资源。

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值