首页 > 其他分享 >设计模式之单例模式

设计模式之单例模式

时间:2023-12-23 16:33:05浏览次数:28  
标签:null private LazyMan public static 模式 单例 设计模式 lazyMan

单例模式

(单例模式)

定义

==单例模式==确保一个类只有一个实例,并提供一个全局访问点。

单例模式实现的方式

1. 饿汉式

public class Hungry {

    //构造器私有
    private Hungry(){
    }
    //类加载时就初始化,主动创建
    private static Hungry hungry = new Hungry();

    public static Hungry getInstance(){
        return hungry;
    }
}

注:避免了线程同步问题,但没有达到懒加载效果,造成内存的浪费。

2. 懒汉式,线程不安全

public class LazyMan {

    private LazyMan(){
    }
    //不主动创建实例,等需要的时候再创建
    private static LazyMan lazyMan;

    public static LazyMan getInstance(){
        if (lazyMan == null){
             lazyMan = new LazyMan();
        }
        return lazyMan;
    }
}

注:单线程下是可行的,但是多线程并行调用getInstance()的时候会创建多个实例。

3. 懒汉式,线程安全

public class LazyMan {

    private LazyMan(){}
    //不主动创建实例,等需要的时候再创建
    private static LazyMan lazyMan;

    public static synchronized LazyMan getInstance(){
        if (lazyMan == null){
            lazyMan = new LazyMan();
        }
        return lazyMan;
    }
}

注:使用synchronized修饰符,避免线程同步问题,但是性能较差。

4. 双重检验锁模式

public class LazyMan {

    private LazyMan(){}
    //不主动创建实例,等需要的时候再创建
    private volatile static LazyMan lazyMan;

    public static LazyMan getInstance(){
        if (lazyMan == null){                   //第一次检查
            synchronized(LazyMan.class){
                if (lazyMan == null){           //第二次检查
                    lazyMan = new LazyMan();
                }
            }
        }
        return lazyMan;
    }
}

注:使用同步块加锁的方式。如果第一次检查instance不为null,那就不需要执行下面的加锁和初始化操作。因此,可以大幅降低synchronized带来的性能开销。

标签:null,private,LazyMan,public,static,模式,单例,设计模式,lazyMan
From: https://blog.51cto.com/u_16370137/8945407

相关文章

  • 设计模式—工厂模式
    介绍代码接口创建Shape接口publicinterfaceShape{voiddraw();}实现类创建Shape接口的三个实现类:Cirle、Rectangle、SquarepublicclassCircleimplementsShape{@Overridepublicvoiddraw(){System.out.println("Circle");}}......
  • 26.基于 page object 模式的测试框架优化实战
    目录异常处理(弹窗黑名单)日志记录报告生成测试数据的数据驱动异常弹框处理定义黑名单列表处理弹框#声明一个黑名单defblack_wrapper(fun):defrun(*args,**kwargs):basepage=args[0]try:returnfun(*args,**kwargs)......
  • 设计模式—适配器模式
    介绍代码接口定义媒体播放器接口MediaPlayer,其中play方法用于播放媒体文件publicinterfaceMediaPlayer{publicvoidplay(StringaudioType,StringfileName);}定义高级播放器接口AdvancedMediaPlayer,规定指定类型媒体的播放方法publicinterfaceAdvancedMe......
  • 一文看懂java单例模式
    ​ Java单例模式是一种常用的创建型设计模式,用于确保一个类只有一个实例,并提供一个全局访问点来访问该实例。在Java中,有多种方式可以实现单例模式,下面详细介绍其中的几种常见实现方式。1什么是创建型设计模式?处理对象创建的模式,简答的理解就是如何创建对象?很多人都会想到new......
  • 在 Linux 上以 All-in-One 模式安装 KubeSphere
    1、什么是KubeSphere KubeSphere 是在 Kubernetes 之上构建的面向云原生应用的分布式操作系统,完全开源,支持多云与多集群管理,提供全栈的IT自动化运维能力,简化企业的DevOps工作流。它的架构可以非常方便地使第三方应用与云原生生态组件进行即插即用(plug-and-play)......
  • javaweb中的设计模式
    1.监听器基于观察者模式。1.myTestEvent自定义事件。被观察者publicclassMyTestEventextendsApplicationEvent2.MyNoAnnotationListener自定义监听器。观察者@ComponentpublicclassMyNoAnnotationListenerimplementsApplicationListener<MyTestEvent>{@Override......
  • 责任链模式
    #include<iostream>#include<string>#include<sstream>usingnamespacestd;template<classT>stringMyConvertToString(Tvalue){stringstreamss;ss<<value;returnss.str();}//顶层的抽象类,规范了击鼓传花的组合能力classH......
  • 策略模式:让你的代码灵活应对不同场景
    写在前面如果你正在为代码的可扩展性和可维护性感到烦恼,策略模式可以成为你的得力助手。本篇技术文章详细介绍了策略模式的核心原理和实战应用,帮助你解决在程序设计中所面临的挑战。无论你是初学者还是有一定经验的开发者,这篇文章都能够为你提供有益的知识和实用的技巧,值得一读!前......
  • 设计模式之工厂模式
    工厂模式(工厂模式)工厂将创建对象的细节抽离出来,实现对修改关闭。定义==工厂方法模式==定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。工厂模式有3种不同的实现方式,分别是简单工厂模式、工厂方法模式和抽象工厂模式。工厂......
  • Tita丨升级看板模式
    看板模式价值:看板模式可以灵活的对任务进行分类和管理,可以根据项目的需要,来创建不同的看板,根据看板,来把任务进行清晰的分类。对于任务和看板可以进行灵活的拖拽,以此来重新设置任务或看板的位置,它比里程碑对任务的展示更加轻量~Tita-OKR和新绩效一体化管理平台该如何来玩转看......