单例模式有几种写法?【如何实现单例模式?】

这篇具有很好参考价值的文章主要介绍了单例模式有几种写法?【如何实现单例模式?】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

专注 效率 记忆
预习 笔记 复习 做题

欢迎观看我的博客,如有问题交流,欢迎评论区留言,一定尽快回复!(大家可以去看我的专栏,是所有文章的目录)
 
文章字体风格:
红色文字表示:重难点★✔
蓝色文字表示:思路以及想法★✔
 
如果大家觉得有帮助的话,感谢大家帮忙
点赞!收藏!转发!

单例模式常见的实现方法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举。

1.饿汉模式

饿汉模式也叫预加载模式,它是在类加载时直接创建并初始化单例对象,所以它并不存在线程安全的问题。它是依靠 ClassLoader 类机制,在程序启动时只加载一次,因此不存在线程安全问题,它的实现代码如下:

public class Singleton {
    // 1.防止外部直接 new 对象破坏单例模式
    private Singleton() {}
    // 2.通过私有变量保存单例对象
    private static Singleton instance = new Singleton();
    // 3.提供公共获取单例对象的方法
    public static Singleton getInstance() {
        return instance;
    }
}

优点:实现简单、不存在线程安全问题。 缺点:类加载时就创建了对象,创建之后如果没被使用,就造成了资源浪费的情况。

2.懒汉模式

懒汉模式和饿汉模式正好是相反的,所谓的懒汉模式也就是懒加载(延迟加载),指的是它只有在第一次被使用时,才会被初始化,它的实现代码如下:

public class Singleton {
    // 1.防止外部直接 new 对象破坏单例模式
    private Singleton() {}
    // 2.通过私有变量保存单例对象
    private static volatile Singleton instance = null;
    // 3.提供公共获取单例对象的方法
    public static Singleton getInstance() {
        if (instance == null) { // 第一次效验
            synchronized (Singleton.class) {
                if (instance == null) { // 第二次效验
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

懒汉模式使用的是双重效验锁和 volatile 来保证线程安全的,从上述代码可以看出,无论是饿汉模式还是懒汉模式,它们的实现步骤都是一样的:

  1. 创建一个私有的构造方法,防止其他调用的地方直接 new 对象,这样创建出来的对象就不是单例对象了。
  2. 创建一个私有变量来保存单例对象。
  3. 提供一个公共的方法返回单例对象。

懒汉模式相比于饿汉模式来说,不会造成资源的浪费,但写法要复杂一些。

3.静态内部类

静态内部类既能保证线程安全,又能保证懒加载,它只有在被调用时,才会通过 ClassLoader 机制来加载和初始化内部静态类,因此它是线程安全的,此模式的实现代码如下:

public class Singleton {
    // 1.防止外部直接 new 对象破坏单例模式
    private Singleton() {
    }

    // 2.静态内部类
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    // 3.提供公共获取单例对象的方法
    public static final Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

4.枚举

枚举也是在第一次被使用时,才会被 Java 虚拟机加载并初始化,所以它也是线程安全的,且是懒加载的,它的实现代码如下:

public enum  EnumSingleton {
    INSTANCE;
    public EnumSingleton getInstance(){
        return INSTANCE;
    }
}

总结
单例模式适用于经常被访问的对象,或是创建和销毁需要调用大量资源和时间的对象,使用单例模式可以避免频繁创建和销毁对象。单例模式的常用实现方法有 4 种:饿汉模式、懒汉模式、静态内部类和枚举。从写法的简洁性、线程安全性和代码的易懂性等方面综合来看,博主比较推荐使用枚举或懒汉模式来实现单例模式。文章来源地址https://www.toymoban.com/news/detail-471993.html

到了这里,关于单例模式有几种写法?【如何实现单例模式?】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 设计模式学习(一)单例模式的几种实现方式

    目录 前言 饿汉式 懒汉式 懒汉式DCLP 局部静态式(Meyers\\\' Singleton) 单例模板 参考文章 单例模式,其核心目标是确保在程序运行的过程中,有且只有存在一个实例才能保证他们的逻辑正确性以及良好的效率。因此单例模式的实现思路就是确保一个类有且只有一个实例,并提供

    2024年03月19日
    浏览(33)
  • mysql 有几种集群模式

    MySQL 有三种集群模式: 单机模式 主从模式 高可用模式 单机模式是 MySQL 的最简单的模式,只有一台服务器,数据存储在磁盘上。 主从模式是 MySQL 中最常用的模式,包括一台主服务器和一个或多个从服务器。主服务器上的数据会同步到从服务器上,从服务器可以用来做读写分

    2024年02月13日
    浏览(25)
  • Java实现单例模式的几种方法

    单例模式作为23中设计模式中最基础的设计模式,一般实现方式为 ①私有化构造方法 ②提供一个获取对象的静态方法 除此之外,实现单例模式的方法还有很多种,这篇文章主要介绍实现单例模式的几种方法。 目录 一、懒汉式单例 二、懒汉式单例优化(双重检测锁) 三、饿

    2024年02月12日
    浏览(30)
  • Python 实现单例模式的几种方式以及存在的问题

    Python 的模块就是天然的单例模式,因为模块在第一次导入时,会生成 .pyc 文件,当第二次导入时,就会直接加载 .pyc 文件,而不会再次执行模块代码。 直接在其他文件中导入此文件中的对象,这个对象即是单例模式的对象 先执行了类的__new__方法(我们没写时,默认调用ob

    2024年01月22日
    浏览(34)
  • 单例模式的八种写法、单例和并发的关系

    为什么需要单例? 节省内存和计算 保证结果正确 方便管理 无状态的工具类:比如日志工具类,不管是在哪里使用,我们需要的只是它帮我们记录日志信息,除此之外,并不需要在它的实例对象上存储任何状态,这时候我们就只需要一个实例对象即可。 全局信息类:比如我

    2024年01月18日
    浏览(40)
  • Kotlin单例模式的一种懒汉模式写法

    Kotlin单例模式的一种懒汉模式写法 kotlin用object实现单例模式,companion object与java静态_zhangphil的博客-CSDN博客 kotlin中很容易使用object实现java中的单例模式。由于kotlin中没有static修饰词,可以用companion object实现Java中的static效果。kotlin用object实现单例模式,companion object与java静态

    2024年02月12日
    浏览(25)
  • 单例模式的饿汉和懒汉写法(基于C++)

    单例模式确保一个类只有一个实例,并提供全局访问点。这样可以避免在系统中出现多个相同的对象,从而提高系统的性能和可维护性。 单例模式的实现包括饿汉和懒汉,下面介绍C++中这两种方式的写法。 饿汉模式是在程序启动前创建实例。 下面是一个全局计数器的示例。

    2024年02月03日
    浏览(30)
  • 【谈一谈】: 我们工作中的单例模式有哪些写法?

    我们要实现一个单例,首先最重要的是什么? 当然是把构造函数私有化,变成 private 类型,(为啥? 单例单例,如果谁都能通过构造函数创建对象,还叫单例吗?是不~) 嗯~我们构造函数私有化后,我们应该 操作啥 呢? 接着我们需要提供 一个方法 ,这个方法要保证初始化 有且仅 初始化 一

    2024年02月21日
    浏览(35)
  • 几种单例模式

    单例模式指的是一个类只有一个实例,而且自行实例化并向整个系统提供这个实例。这个类成为单例类,它提供一个全局访问点。 单例模式有三要素,一是某个类只能有一个实例;二是它必须自行创建这个实例;三是它必须自行的向整个系统提供这个实例。 几种单例模式的

    2024年02月07日
    浏览(33)
  • MyBatis-Plus 实现分页的几种写法

    MyBatis-Plus (opens new window) (简称 MP)是一个 MyBatis (opens new window) 的增强工具,在 MyBatis 的基础上只做增强不做改变,为简化开发、提高效率而生。 无侵入 :只做增强不做改变,引入它不会对现有工程产生影响,如丝般顺滑 损耗小 :启动即会自动注入基本 CURD,性能基本无损

    2024年01月20日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包