创建型模式5.单例模式

创建型模式

  1. 工厂方法模式(Factory Method Pattern)
  2. 抽象工厂模式(Abstract Factory Pattern)
  3. 建造者模式(Builder Pattern)
  4. 原型模式(Prototype Pattern)
  5. 单例模式(Singleton Pattern)

单例模式(Singleton Pattern) 是一种设计模式,旨在确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式可以用于管理全局的资源,确保整个系统中只有一个对象来处理特定任务。

单例模式的关键特性:

  1. 确保只有一个实例:单例模式确保在整个应用程序生命周期内,某个类只有一个实例。
  2. 提供全局访问点:通过公共静态方法,可以访问该唯一的实例。
  3. 延迟实例化:有时实例化时机会被延迟,只有在需要时才创建实例(懒汉式)。

1. 懒汉式(Lazy Initialization)

懒汉式单例模式在第一次使用时创建实例。它通常是线程不安全的,但可以通过同步来确保线程安全。

线程不安全的懒汉式:
public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

    public static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();  // 延迟实例化
        }
        return instance;
    }
}

问题:

  • 上述代码线程不安全。如果多个线程同时访问 getInstance() 方法,在没有同步的情况下,可能会创建多个实例。

线程安全的懒汉式: 

public class Singleton {
    private static Singleton instance;

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

    public synchronized static Singleton getInstance() {
        if (instance == null) {
            instance = new Singleton();  // 延迟实例化
        }
        return instance;
    }
}

优点:

  • 只有在需要实例时才创建(延迟加载)。

缺点:

  • 使用 synchronized 来保证线程安全会影响性能,因为每次调用 getInstance() 都需要加锁。

2. 饿汉式(Eager Initialization)

饿汉式单例模式在类加载时立即创建实例。线程安全,且没有懒汉式的延迟加载问题,但不适用于需要在应用程序启动时创建对象的场景。

public class Singleton {
    // 静态实例在类加载时创建
    private static final Singleton instance = new Singleton();

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

    public static Singleton getInstance() {
        return instance;
    }
}

优点:

  • 实例在类加载时创建,因此线程安全,不需要额外的同步操作。
  • 不会有性能问题。

缺点:

  • 如果类加载时没有使用单例对象,可能会浪费资源。

3. 双重检查锁定(Double-Checked Locking)

双重检查锁定是一种改进的懒汉式单例模式,使用 synchronized 来确保线程安全,但仅在实例为空时加锁,避免了每次调用 getInstance() 都加锁的性能损失。

public class Singleton {
    private static volatile Singleton instance;

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();  // 延迟实例化
                }
            }
        }
        return instance;
    }
}

优点:

  • 只有在实例为空时才进行加锁,减少了加锁的开销,提供了懒加载的优点,并且是线程安全的。

缺点:

  • 需要使用 volatile 关键字,确保内存可见性。

4. 静态内部类方式(推荐)

静态内部类方式是实现单例模式的最佳方法之一。它利用了类的加载机制,保证了线程安全和延迟加载。

public class Singleton {
    // 静态内部类,只有在调用 getInstance 时才会加载
    private static class SingletonHolder {
        private static final Singleton INSTANCE = new Singleton();
    }

    private Singleton() {
        // 私有构造函数,防止外部实例化
    }

    public static Singleton getInstance() {
        return SingletonHolder.INSTANCE;
    }
}

优点:

  • 线程安全,且实现简单。
  • 延迟加载,只有在调用 getInstance() 时才实例化对象。
  • 通过类的加载机制实现线程安全,不需要显式加锁。
  • 具体的解析参考这个文章:静态内部类为什么在不需要加锁就是线程安全的单例模式-CSDN博客

总结:

  1. 懒汉式(线程不安全): 延迟实例化,适合需要延迟加载的场景,但需要处理线程安全问题。
  2. 饿汉式(线程安全): 类加载时实例化,线程安全,简单,但可能会造成资源浪费。
  3. 双重检查锁定: 提供了懒加载和线程安全的优势,性能较高。
  4. 静态内部类方式(推荐): 最佳的单例实现方式,延迟加载,线程安全,且简单。

对于大多数情况,静态内部类方式是最推荐的实现方式,因为它利用了Java的类加载机制,在保证线程安全的同时也保持了延迟加载的优点。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/950032.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

以C++为基础快速了解C#

using System: - using 关键字用于在程序中包含 System 命名空间。 一个程序一般有多个 using 语句, 相当于C的 using namespace std; C# 是大小写敏感的。 所有的语句和表达式必须以分号(;)结尾。 程序的执行从 Main 方法开始。 与 Java 不同的是&#…

面试题:并发与并行的区别?

并发(Concurrency)和并行(Parallelism)是计算机科学中两个相关但不同的概念,它们都涉及到同时处理多个任务,但在实现方式和效果上有显著的区别。理解这两者的区别对于编写高效的多任务程序非常重要。 并发&…

面向对象分析和设计OOA/D,UML,GRASP

目录 什么是分析和设计? 什么是面向对象的分析和设计? 迭代开发 UML 用例图 交互图 基于职责驱动设计 GRASP 常见设计原则 什么是分析和设计? 分析,强调是对问题和需求的调查研究,不是解决方案。例如&#x…

MySQL使用navicat新增触发器

找到要新增触发器的表,然后点击设计,找到触发器标签。 根据实际需要,填写相关内容,操作完毕,点击保存按钮。 在右侧的预览界面,可以看到新生成的触发器脚本

Anthropic 的人工智能 Claude 表现优于 ChatGPT

在人工智能领域,竞争一直激烈,尤其是在自然语言处理(NLP)技术的发展中,多个公司都在争夺市场的主导地位。OpenAI的ChatGPT和Anthropic的Claude是目前最具影响力的两款对话型AI产品,它们都能够理解并生成自然…

《罪恶装备-奋战》官方中文学习版

《罪恶装备 -奋战-》是Arc System Works开发的格斗游戏《罪恶装备》系列的第二十五部作品 [1],男主角索尔历时25年的故事就此画上句号,而罪恶装备的故事却并未结束。 《罪恶装备-奋战》官方中文版 https://pan.xunlei.com/s/VODWAm1Dv-ZWVvvmUMflgbbxA1…

期末概率论总结提纲(仅适用于本校,看文中说明)

文章目录 说明A选择题1.硬币2.两个事件的关系 与或非3.概率和为14.概率密度 均匀分布5.联合分布率求未知参数6.联合分布率求未知参数7.什么是统计量(记忆即可)8.矩估计量9.117页12题10.显著水平阿尔法(背公式就完了) 判断题11.事件…

流程图(四)利用python绘制漏斗图

流程图(四)利用python绘制漏斗图 漏斗图(Funnel Chart)简介 漏斗图经常用于展示生产经营各环节的关键数值变化,以较高的头部开始,较低的底部结束,可视化呈现各环节的转化效率与变动大小。一般重…

继承(5)

大家好,今天我们继续来学习继承的相关知识,来看看子类构造方法(也叫做构造器)是如何做的。 1.6 子类构造方法 父子父子,先有父再有子,即:子类对象构选时,需要先调用基类构造方法,然后执行子类的构造方法 ★此时虽然执行了父类的…

Vue框架主要用来做什么?Vue框架的好处和特性.

在快速发展的互联网时代,前端开发技术的变革日新月异,为开发者带来了前所未有的机遇与挑战。Vue.js,作为前端开发领域的一颗璀璨新星,以其轻量级、高效灵活的特性,赢得了广大开发者的青睐。本文将深入探讨Vue框架的主要…

搭建Hadoop分布式集群

软件和操作系统版本 Hadoop框架是采用Java语言编写,需要java环境(jvm) JDK版本:JDK8版本 ,本次使用的是 Java: jdk-8u431-linux-x64.tar.gz Hadoop: hadoop-3.3.6.tar.gz 三台Linux虚拟节点: CentOS-7-x86_64-DVD-2…

电子应用设计方案87:智能AI收纳箱系统设计

智能 AI 收纳箱系统设计 一、引言 智能 AI 收纳箱系统旨在为用户提供更高效、便捷和智能的物品收纳与管理解决方案,通过融合人工智能技术和创新设计,提升用户的生活品质和物品整理效率。 二、系统概述 1. 系统目标 - 实现物品的自动分类和整理&#xf…

MySQL数据结构选择

系列文章目录 一、MySQL数据结构选择 二、MySQL性能优化explain关键字详解 三、MySQL索引优化 文章目录 系列文章目录前言一、索引1.1、什么是索引1.2、构建索引的过程1.3、索引的更新和维护1.4、索引的查询和管理1.5、InnoDB 和 MyISAM 的索引实现1.6、联合索引和最左前缀法则…

shell基础使用及vim的常用快捷键

一、shell简介 参考博文1 参考博文2——shell语法及应用 参考博文3——vi的使用 在linux中有很多类型的shell,不同的shell具备不同的功能,shell还决定了脚本中函数的语法,Linux中默认的shell是 / b in/ b a s h ,流行的shell…

(leetcode算法题)76. 最小覆盖子串

以s "ADOBECODEBANC", t "ABC"为例,进行如下演示 对于上图的说明: 1. 上面八个状态是在从左往右滑动窗口时,每发现一个窗口满足以下条件就进行状态暂停 条件:s[l, r] 覆盖了 t 这个字符串 2. 只有出窗口之…

二、BIO、NIO编程与直接内存、零拷贝

一、网络通信 1、什么是socket? Socket 是应用层与 TCP/IP 协议族通信的中间软件抽象层,它是一组接口,一般由操作 系统提供。客户端连接上一个服务端,就会在客户端中产生一个 socket 接口实例,服务端每接受 一个客户端…

HDFS架构原理

一、HDFS架构整体概述 HDFS是Hadoop Distribute File System 的简称,意为:Hadoop分布式文件系统。HDFS是Hadoop核心组件之一,作为大数据生态圈最底层的分布式存储服务而存在。HDFS解决的问题就是大数据如何存储,它是横跨在多台计算机上的文件…

Qt项目打包成绿色软件

Qt项目打包成绿色软件 一、图标添加与配置二、编译后打包文件附录有朋友将程序发给别人后运行,发现各种问题,如: 1.无法定位程序输入点__cxa_thread_atexit于动态链接库…。 2.缺少各种**.dll文件。 问‌我运行环境上Microsoft Visual C++ Redistributable运行环境都有,版本…

自动驾驶相关知识学习笔记

一、概要 因为想知道SIL、HIL是什么仿真工具,故而浏览了自动驾驶相关的知识。 资料来源《自动驾驶——人工智能理论与实践》胡波 林青 陈强 著;出版时间:2023年3月 二、图像的分类、分割与检测任务区别 如图所示,这些更高阶的…

C# 之某度协议登录,JS逆向,手机号绑定,获取CK

.NET兼职社区 .NET兼职社区 .NET兼职社区 .NET兼职社区 有需要指导,请私信我留言V或者去社区找客服。