首页 > 其他分享 >【设计模式】单例模式——单例模式的懒汉式和DCL式实现

【设计模式】单例模式——单例模式的懒汉式和DCL式实现

时间:2024-01-06 18:31:51浏览次数:26  
标签:Singleton 模式 instance DCLSingleton private 单例 设计模式 懒汉

懒汉式

为了解决饿汉式单例带来的内存浪费问题,出现了懒汉式单例的写法,代码如下:

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

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

由此可见,懒汉式单例的特点就是只有在单例对象第一次被调用时才会被实例化。值得注意的是,懒汉式单例对象一旦被赋值以后就不能被回收,能解决内存浪费问题只体现在个人手机、电脑上(上次启动软件调用A单例,下次启动软件调用B单例),对于像服务器这种一旦启动就不停下的场景没有太明显的意义。

除此以外,懒汉式还存在线程安全问题,线程安全问题可以靠加锁解决。


DCL式

DCL式的全称是double check lock,就是在加锁前后两次判空。代码如下:

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

注意volatile、synchronized以及synchronized前后的两次判空


标签:Singleton,模式,instance,DCLSingleton,private,单例,设计模式,懒汉
From: https://blog.51cto.com/dongfeng9ge/9127378

相关文章

  • 设计模式Java实战,彻底学会
    这是全网最强的Java设计模式实战教程。此教程用实际项目场景,结合SpringBoot,让你真正掌握设计模式。网址是:Java设计模式实战专栏介绍-自学精灵(也可以百度搜索“自学精灵”)。本设计模式专栏的威力用Java实战来介绍常用的设计模式,让你真正掌握设计模式。用项目实际场景进行设计模式......
  • Django中的URL模式
    Django中的URL模式是一种用于处理HTTP请求和将请求映射到相应的视图函数的技术。URL模式是Django路由系统的基础,它负责接收客户端发送的请求,并将其映射到相应的视图函数进行处理。URL模式的核心功能是URL匹配和视图函数的调用。URL模式底层逻辑主要包括以下几个方面:URL模式类:Django......
  • 使用Apache Commons Chain实现命令模式
    第1章:引言大家好,我是小黑。今天咱们来聊聊一个挺有意思的话题:如何用ApacheCommonsChain实现命令模式。首先,得先搞明白什么是命令模式,对吧?命令模式,它其实是一种设计模式,主要用来把一个请求或者操作封装成一个对象。这样做的好处是什么呢?主要是让你的软件设计更加灵活,更容易扩展......
  • rabbitmq的五种模式
    第一种:简单模式Simple       一个消费者消费一个队列 第二种:工作模式Work        多个消费者消费一个队列 第三种:发布订阅模式             X代表交换机消息产生者将消息放入交换机,交换机发布订阅把消息......
  • 【设计模式】单例模式——利用ThreadLocal或CAS实现单线程内部的单例模式
    很多时候我们并不需要一个类创建的对象是全局唯一的,只需要保证在单个线程内是唯一的、线程安全的就可以。为了实现单线程内部的单例,我们可以用ThreadLocal或CAS实现。利用ThreadLocal实现先看代码:publicclassThreadLocalSingleton{privatestaticfinalThreadLocal<Thread......
  • 代理模式
    动态代理核心代码/***@Author:jishaleng*/publicclassProxyInvocationHandlerimplementsInvocationHandler{//目标对象/委托对象privateObjecttarget;publicProxyInvocationHandler(Objecttarget){this.target=target;}......
  • 《PySpark大数据分析实战》-07.Spark本地模式安装
    ......
  • 【设计模式】单例模式——单例模式的饿汉式和枚举式实现
    饿汉式单例模式的最简单实现如下:publicclassSingletonimplementsSerializable{privatestaticSingletoninstance=newSingleton();privateSingleton(){}publicstaticSingletongetInstance(){returninstance;}}这种写法被称为“饿汉式......
  • 软件体系结构与设计模式之适配器模式
    一.单选题(共4题,8分)(单选题,2分)当想使用一个已经存在的类,但其接口不符合需求时,可以采用()设计模式将该类的接口转换成我们希望的接口。A.命令(Command)B.适配器(Adapter)C.装饰(Decorator)D.享元(Flyweight)我的答案:B:适配器(Adapter);正确答案:B:适配......
  • 软件体系结构与设计模式之桥接模式
    一.单选题1.桥接设计模式将抽象部分与它的实现部分相分离,使它们都可以独立地变化。下图为该设计模式的类图,其中,()用于定义实现部分的接口。A.AbstractionB.ConcreteImplementorAC.ConcreteImplementorBD.Implementor我的答案:D:Implementor;正确答案:D:Implementor......