iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > JAVA >单例模式详解
  • 237
分享到

单例模式详解

设计模式单例模式java面试 2023-10-02 07:10:04 237人浏览 八月长安
摘要

目录 一、什么是单例模式 二、单例模式的结构 三、单例模式分类 四、单例模式优缺点 五、创建单例模式 饿汉式 1. 静态成员变量方式 2.静态代码块方式 懒汉式 1.线程不安全 2.线程安全(优化) 3.双重检查锁模式 4. 静态内部类方

目录

一、什么是单例模式

二、单例模式的结构

三、单例模式分类

四、单例模式优缺点

五、创建单例模式

饿汉式

1. 静态成员变量方式

2.静态代码块方式

懒汉式

1.线程不安全

2.线程安全(优化)

3.双重检查锁模式

4. 静态内部类方式

5.枚举方式


一、什么是单例模式

        单例模式是Java中最简单的设计模式之一。这种类型的设计模式属于创建者模式,它提供了一种访问对象的最佳方式。

        这种设计模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一对象的方式,可以直接访问,不需要实例化该类的对象。

二、单例模式的结构

单例类:只能创建一个实例的类

访问类:使用单例类的类

三、单例模式分类

饿汉式:类加载就会导致该单实例对象被创建

懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时被创建

四、单例模式优缺点

优点: 1、在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例(比如管理学院首页页面缓存)。

避免对资源的多重占用(比如写文件操作)。

缺点:没有接口,不能继承,与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化。

主要解决:一个全局使用的类频繁地创建与销毁。

何时使用:当您想控制实例数目,节省系统资源的时候。

如何解决:判断系统是否已经有这个单例,如果有则返回,如果没有则创建。

关键代码:构造函数是私有的。

注意:

单例类只能有一个实例。

单例类必须自己创建自己的唯一实例。

单例类必须给所有其他对象提供这一实例。

五、创建单例模式

饿汉式

存在问题:

类加载时对象就被创建,一直在内存中,如果一直不适用,该对象仍在,会存在内存浪费问题

1. 静态成员变量方式

public class HungryChinese {    //私有构造方法    private HungryChinese(){}    //在该类中创建一个该类的对象供外界去使用    private static HungryChinese hungryChinese = new HungryChinese();    //提供一个公共的访问方式,让外界获取hungryChinese对象    public static HungryChinese getInstance(){        return hungryChinese;    }}class HungryChineseTest{    public static void main(String[] args) {        //获取单例类的对象,因为对象私有,只能通过方法去获取        HungryChinese instance = HungryChinese.getInstance();        HungryChinese instance1 = HungryChinese.getInstance();        //判断是否为同一个对象        System.out.println(instance.equals(instance1));    }}

2.静态代码块方式

public class HungryChinese2 {    //私有构造方法,为了不让外界创建该类的对象    private HungryChinese2(){}    //声明该类类型的变量    private static HungryChinese2 hungryChinese2;//初始值为null    //静态代码块中赋值    static {        hungryChinese2 = new HungryChinese2();    }    //对外提供的访问方式    public static HungryChinese2 getInstance(){        return hungryChinese2;    }}class HungryChinese2Test{    public static void main(String[] args) {        HungryChinese2 instance = HungryChinese2.getInstance();        HungryChinese2 instance1 = HungryChinese2.getInstance();        System.out.println(instance.equals(instance1));    }}

懒汉式

1.线程安全

public class LazyMan {    //私有构造方法,为了不让外界创建该类的对象    private LazyMan(){}    //声明LazyMan类型的变量    private static LazyMan instance;//只是声明了该类的对象,没有赋初始值    //对外提供访问方式    public static LazyMan getInstance(){        //判断instance是否为null,如果为null,说明还没有创建LazyMan类的对象        //如果没有,创建一个并返回;如果有,直接返回        //线程不安全,多线程下会创建多个对象        if (instance == null){            instance = new LazyMan();        }            return instance;    }}class LazyManTest{    public static void main(String[] args) {        LazyMan instance = LazyMan.getInstance();        LazyMan instance1 = LazyMan.getInstance();        System.out.println(instance.equals(instance1));    }}

2.线程安全(优化

public class LazyMan2 {    //私有构造方法,为了不让外界创建该类的对象    private LazyMan2(){}    //声明LazyMan类型的变量    private static LazyMan2 instance;//只是声明了该类的对象,没有赋初始值    //对外提供访问方式    public static LazyMan2 getInstance(){        //判断instance是否为null,如果为null,说明还没有创建LazyMan类的对象        //如果没有,创建一个并返回;如果有,直接返回        if (instance == null){            //线程1等待,线程2获取到cpu执行权,也会进入到该判断里            instance = new LazyMan2();        }        return instance;    }}class LazyMan2Test{    public static synchronized void main(String[] args) {        LazyMan2 instance = LazyMan2.getInstance();        LazyMan2 instance1 = LazyMan2.getInstance();        System.out.println(instance.equals(instance1));    }}

3.双重检查模式

        双重检查锁模式解决了单例、性能、线程安全问题,看似完美无缺,其实存在问题,在多线程情况下,可能会出现空指针问题问题在于JVM在实例化对象时会进行优化和指令重排序操作。解决空指针问题只需使用volatile关键字,volatile可以保证可见性和有序性。

public class LazyMan3 {    private LazyMan3(){}    private static volatile LazyMan3 instance;    public static LazyMan3 getInstance(){        //第一次判断,如果instance不为null,不需要抢占锁,直接返回对象        if (instance == null){            synchronized (LazyMan3.class){                //第二次判断                if (instance == null){                    instance = new LazyMan3();                }            }        }        return instance;    }}class LazyMan3Test{    public static void main(String[] args) {        LazyMan3 instance = LazyMan3.getInstance();        LazyMan3 instance1 = LazyMan3.getInstance();        System.out.println(instance == instance1);    }}

4. 静态内部类方式

        静态内部类模式中实例由内部类创建,由于JVM在加载外部类的过程中,是不会加载静态内部类的,只有内部类的方法/属性被调用时才会被加载,并初始化静态属性,静态属性由于被static修饰,保证只能被初始化一次,并且严格保证实例化顺序。

        静态内部类模式是一种优秀的单例模式。在没有任何锁的情况下,保证了多线程下的安全,并且没有任何性能影响和空间浪费。

public class LazyMan4 {    private LazyMan4(){}    //定义一个静态内部类    private static class LazyMan4Holder{        private static final LazyMan4 INSYANCE = new LazyMan4();    }    //对外访问方法    public static LazyMan4 getInstance(){        return LazyMan4Holder.INSYANCE;    }}class LazyMan4Test{    public static void main(String[] args) {        LazyMan4 instance = LazyMan4.getInstance();        LazyMan4 instance1 = LazyMan4.getInstance();        System.out.println(instance == instance1);    }}

5.枚举方式

枚举方式属于饿汉式方式

枚举类实现单例模式是极力推荐的单例实现模式,因为枚举是线程安全的,并且只会装载一次,枚举类是所有单例类实现中唯一不会被破坏的单例模式。

public enum LazyMan5 {    INSTANCE;}class LazyMan5Test{    public static void main(String[] args) {        LazyMan5 instance = LazyMan5.INSTANCE;        LazyMan5 instance1 = LazyMan5.INSTANCE;        System.out.println(instance == instance1);    }}

来源地址:https://blog.csdn.net/weixin_57504474/article/details/124494554

--结束END--

本文标题: 单例模式详解

本文链接: https://www.lsjlt.com/news/422534.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 单例模式详解
    目录 一、什么是单例模式 二、单例模式的结构 三、单例模式分类 四、单例模式优缺点 五、创建单例模式 饿汉式 1. 静态成员变量方式 2.静态代码块方式 懒汉式 1.线程不安全 2.线程安全(优化) 3.双重检查锁模式 4. 静态内部类方...
    99+
    2023-10-02
    设计模式 单例模式 java 面试
  • Java设计模式之单例模式示例详解
    目录0.概述1.饿汉式1.1 饿汉式单例实现1.2 破坏单例的几种情况1.3 预防单例的破坏2.枚举饿汉式2.1 枚举单例实现2.2 破坏单例3.懒汉式4.双检锁懒汉式5.内部类懒汉...
    99+
    2024-04-02
  • java 单例模式和工厂模式实例详解
    单例模式根据实例化对象时机的不同分为两种:一种是饿汉式单例,一种是懒汉式单例。私有的构造方法指向自己实例的私有静态引用以自己实例为返回值的静态的公有的方法饿汉式单例 public class Singleton { private ...
    99+
    2023-05-31
    java 单例模式 工厂模式
  • JAVA设计模式之单例模式详解
    目录前言一、单例模式是什么?二、懒汉式单例三、饿汉式单例四、双重校验锁总结前言 在之前的文章里已经介绍了设计模式以及设计原则的概念,接下来我们从单例模式入手深入学习几种常用的JAVA...
    99+
    2024-04-02
  • Android设计模式之单例模式详解
    单例模式一个类只有一个实例,并且可以全局访问使用应用场景如账户管理类,数据库操作类等(某个对象频繁被访问使用)常用方式饿汉式懒汉式同步加锁DCL双重加锁验证静态内部类枚举单例饿汉式加载类的同时立即进行初始化操作,对资源消耗很大public ...
    99+
    2023-05-30
    android 设计模式 单例模式
  • C++设计模式之单例模式详解
    目录单例模式:就是只有一个实例。单例模式又分为两种基本的情形:饿汉式和懒汉式如下是懒汉式单例类小结:继续看单例模式总结单例模式:就是只有一个实例。 singleton pattern...
    99+
    2024-04-02
  • java 单例模式的实例详解
    java 单例模式的实例详解概念:    java中单例模式是一种常见的设计模式,单例模式分三种:懒汉式单例、饿汉式单例、登记式单例三种。    单例模式有一下特点:   1、单例类只能有一个实例。   2、单例类必须自己自己创建自己的唯一...
    99+
    2023-05-31
    java 单例模式 ava
  • Java 单例模式详细解释
    目录饿汉式懒汉式懒汉式(加锁synchronized)懒汉式(部分加锁synchronized)懒汉式(DCL)懒汉式(DCL)最终版静态内部类总结饿汉式 public cla...
    99+
    2024-04-02
  • Go语言单例模式详解
    目录什么是单例模式Go中实现单例模式的方式方法一: 懒汉式方法二:饿汉式方法三:双重检查锁定示例总结单例模式是一种常见的设计模式,它在系统中仅允许创建一个实例来控制对某些资源的访问。...
    99+
    2023-03-23
    Go语言单例模式
  • Go语言单例模式示例详解
    目录简单单例模式加锁的单例模式双check 的单例模式sync.Once 的单例模式简单单例模式 单例模式是创建类型的模式,它是为了保证执行期间内只有一个实例。使用 Golang 指...
    99+
    2024-04-02
  • 详解Go语言设计模式之单例模式
    目录单例模式的概念单例模式结构单例模式的使用场景单例模式例子:特殊的计数器第一个单元测试单例模式实现单例模式优缺点单例模式的概念 单例模式很容易记住。就像名称一样,它只能提供对象的单...
    99+
    2024-04-02
  • Golang设计模式之单例模式详细讲解
    目录单例模式概念示例单例模式 单例是一种创建型设计模式, 让你能够保证一个类只有一个实例, 并提供一个访问该实例的全局节点。 单例拥有与全局变量相同的优缺点。 尽管它们非常有用, 但...
    99+
    2023-01-11
    Go单例模式 Go设计模式
  • C++单例模式的懒汉模式和饿汉模式详解
    目录懒汉模式饿汉模式线程安全的懒汉模式总结懒汉模式 懒汉模式在第一次用到类实例的时候才会去实例化,就是不到调用getInstance函数时,这个类的对象是一直不存在的。懒汉本身是线程...
    99+
    2024-04-02
  • java设计模式-单例模式实现方法详解
    目录饿汉式静态变量静态代码块懒汉式线程不安全线程安全双重检查静态内部类总结单例模式,属于创建类型的一种常用的软件设计模式。通过单例模式的方法创建的类在当前进程中只有一个实例(根据需要...
    99+
    2024-04-02
  • C++单例设计模式详细讲解
    目录特殊类设计只能在堆上创建对象的类请设计一个类只能在栈上创建对象请设计一个类不能被拷贝请设计一个类不能被继承请设计一个类只能创建一个对象(单例模式)懒汉模式和饿汉模式的对比特殊类设...
    99+
    2024-04-02
  • Java设计模式之单例模式实例详解【懒汉式与饿汉式】
    本文实例讲述了Java设计模式之单例模式。分享给大家供大家参考,具体如下:单例模式就是产生一个对象实例,供外外部访问。它的应用场景就是在这个类在全局真资源需要统一访问,否则会造成混乱时,才有必要设计成单例。懒汉式,就是在使用这个对象时,才去...
    99+
    2023-05-31
    java 设计模式 单例模式
  • Java中常用的设计模式之单例模式详解
    目录注意优点缺点使用场景一、实现方式二、实现方式三、测试总结注意 1、单例类只能有一个实例。 2、单例类必须自己创建自己的唯一实例。 3、单例类必须给所有其他对象提供这一实例。 优点...
    99+
    2024-04-02
  • 详解Java单例模式中的饿汉和懒汉模式
    目录一.什么是单例模式一.饿汉模式1.饿汉模式的概念2.饿汉模式代码3.多线程是否线程安全二.懒汉模式1.懒汉模式的概念2.单线程情况下的懒汉模式3.多线程情况下的懒汉模式一.什么是...
    99+
    2023-05-14
    Java单例模式 Java单例饿汉模式 Java单例懒汉模式
  • kotlinobject关键字单例模式实现示例详解
    目录正文一、 匿名内部类二、单例模式三、伴生对象1、深入分析伴生对象2、用伴生对象实现工厂模式3、用伴生对象实现单例模式(1)、借助懒加载委托(2)、伴生对象 Double Chec...
    99+
    2023-01-12
    kotlin object关键字单例模式 kotlin object
  • Java中的单例模式详解(完整篇)
    目录前言WHATWHY饿汉式实现一:静态实例参数与静态代码块实现二:静态内部类懒汉式错误一:单线程实现错误二:同步方法错误三:同步代码块之单次检查错误四:同步代码块之双重检查正确:双...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作