当前位置: 首页 > news >正文

单例模式详解

文章目录

  • 一、概述
    • 1.单例模式
    • 2.单例模式的特点
    • 3.单例模式的实现方法
  • 二、单例模式的实现
    • 1. 饿汉式
    • 2. 懒汉式
    • 3. 双重校验锁
    • 4. 静态内部类
    • 5. 枚举
  • 三、总结

一、概述

1.单例模式

单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类只有一个实例,并提供一个全局访问点。这种模式在需要一个对象被共享且全局唯一的情况下非常有用,比如配置对象、日志对象、数据库连接对象等。

2.单例模式的特点

唯一性:保证一个类只有一个实例。
全局访问点:提供一个全局访问点来获取该实例。

3.单例模式的实现方法

单例模式有多种实现方式,常见的有饿汉式、懒汉式、双重校验锁、静态内部类和枚举等。以下是这些方法的详细实现及其优缺点。

二、单例模式的实现

1. 饿汉式

饿汉式单例模式在类加载时就初始化实例,因此线程安全。

public class Singleton {private static final Singleton INSTANCE = new Singleton();private Singleton() {// 私有构造函数,防止实例化}public static Singleton getInstance() {return INSTANCE;}
}

优点:

  • 实现简单。
  • 线程安全。

缺点:

  • 类加载时就实例化,可能造成资源浪费。

2. 懒汉式

懒汉式单例模式在第一次使用时才初始化实例,不是线程安全的,需要加锁。

public class Singleton {private static Singleton instance;private Singleton() {// 私有构造函数,防止实例化}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

优点:

  • 延迟加载,节省资源。

缺点:

  • 需要加锁,性能较差。
  • 每次获取实例时都需要同步,开销较大。

3. 双重校验锁

双重校验锁在懒汉式的基础上进行了优化,减少了不必要的同步开销。

public class Singleton {// 使用 volatile 关键字确保 instance 的可见性和有序性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 关键字,确保可见性和有序性。

解释步骤:
1、为什么双重🔐
第一次检查(无锁):
if (instance == null):第一次检查是否已经有实例。如果有,则直接返回实例,避免进入同步块,提高性能。
同步块:synchronized (Singleton.class):如果第一次检查发现实例为null,进入同步块,确保只有一个线程能够进入创建实例的代码。
第二次检查(有锁):
if (instance == null):再次检查实例是否为null。这是因为在同步块外的第一次检查和进入同步块之间,可能有另一个线程已经创建了实例。
2、为什么需要 volatile
使用 volatile 关键字确保 instance 的可见性和有序性。它防止了指令重排序可能导致的问题。在没有 volatile 的情况下,可能会发生如下情况:
分配内存。
初始化对象。
设置 instance 指向分配的内存。
指令重排序可能会使步骤2和步骤3的顺序颠倒,使得一个线程看到一个未完全初始化的对象。因此,volatile 确保了步骤2和步骤3的顺序不会被颠倒。

4. 静态内部类

利用静态内部类的特性实现单例模式,线程安全且延迟加载。

public class Singleton {private Singleton() {// 私有构造函数,防止实例化}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

优点:

  • 延迟加载,节省资源。
  • 线程安全,利用类加载机制保证初始化时只有一个线程。

缺点:

  • 代码较简单,易读性好。

5. 枚举

利用枚举实现单例模式,天生线程安全,防止反序列化创建新实例。

public enum Singleton {INSTANCE;public void someMethod() {// 单例方法}
}// 测试类public static void main(String[] args) {// 创建枚举对象SingletonEnum instance1 = SingletonEnum.INSTANCE;SingletonEnum instance2 = SingletonEnum.INSTANCE;System.out.println( instance1== instance2);instance1.run();//System.out.println(SingletonEnum.INSTANCE);		}

优点:

  • 实现简单。
  • 天生线程安全。
  • 防止反序列化创建新实例。

缺点:

  • 不能延迟加载(可以通过懒初始化方法来实现)。

三、总结

单例模式通过确保一个类只有一个实例,提供了一种全局访问点来访问该实例。根据不同的需求和场景,可以选择不同的实现方式。

饿汉式和枚举方式实现简单,但不能延迟加载;懒汉式和双重校验锁方式可以延迟加载,但需要考虑线程安全问题;静态内部类方式兼具延迟加载和线程安全,是一种推荐的实现方式。

单例模式的特点:
1.构造方法私有化(即构造方法被private修饰)
2.该单例对象必须由单例类自行创建
3.内部提供一个公共静态的方法给外界进行访问(方法被public static 修饰)

相关文章:

单例模式详解

文章目录 一、概述1.单例模式2.单例模式的特点3.单例模式的实现方法 二、单例模式的实现1. 饿汉式2. 懒汉式3. 双重校验锁4. 静态内部类5. 枚举 三、总结 一、概述 1.单例模式 单例模式(Singleton Pattern)是一种创建型设计模式,确保一个类…...

WebGIS主流的客户端框架比较|OpenLayers|Leaflet|Cesium

实现 WebGIS 应用的主流前端框架主要包括 OpenLayers、Leaflet、Mapbox GL JS 和 Cesium 等。每个框架都有其独特的功能和优势,适合不同的应用场景。 WebGIS主流前端框架的优缺点 前 端 框架优点缺点OpenLayers较重量级的开源库,二维GIS功能最丰富全面…...

【LabVIEW作业篇 - 2】:分数判断、按钮控制while循环暂停、单击按钮获取book文本

文章目录 分数判断按钮控制while循环暂停按钮控制单个while循环暂停 按钮控制多个while循环暂停单击按钮获取book文本 分数判断 限定整型数值输入控件值得输入范围,范围在0-100之间,判断整型数值输入控件的输入值。 输入范围在0-59之间,显示…...

Kafka架构详解之分区Partition

目录 一、简介二、架构三、分区Partition1.分区概念2.Offsets(偏移量)和消息的顺序3.分区如何为Kafka提供扩展能力4.producer写入策略5.consumer消费机制 一、简介 Apache Kafka 是分布式发布 - 订阅消息系统,在 kafka 官网上对 kafka 的定义…...

SSM之Mybatis

SSM之Mybatis 一、MyBatis简介1、MyBatis特性2、MyBatis的下载3、MyBatis和其他持久化层技术对比 二、MyBatis框架搭建三、MyBatis基础功能1、MyBatis核心配置文件2、MyBatis映射文件3、MyBatis实现增删改查4、MyBatis获取参数值的两种方式5、MyBatis查询功能6、MyBatis自定义映…...

Python list comprehension (列表推导式 - 列表解析式 - 列表生成式)

Python list comprehension {列表推导式 - 列表解析式 - 列表生成式} 1. Python list comprehension (列表推导式 - 列表解析式 - 列表生成式)2. Example3. ExampleReferences Python 中的列表解析式并不是用来解决全新的问题,只是为解决已有问题提供新的语法。 列…...

2024年7月12日理发记录

上周五天气还算好,不太热,晚上下班打车回家后,将目的地设置成日常去的那个理发店。 下车走到门口,熟悉的托尼帅哥正在抽烟,他一眼看到了我,马上掐灭烟头,从怀里拿出口香糖,咀嚼起来&…...

几种常用排序算法

1 基本概念 排序是处理数据的一种最常见的操作,所谓排序就是将数据按某字段规律排列,所谓的字段就是数据节点的其中一个属性。比如一个班级的学生,其字段就有学号、姓名、班级、分数等等,我们既可以针对学号排序,也可…...

Spring3(代理模式 Spring1案例补充 Aop 面试题)

一、代理模式 在代理模式(Proxy Pattern)中,一个类代表另一个类的功能,这种类型的设计模式属于结构型模式。 代理模式通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介,负责将客户端…...

Github报错:Kex_exchange_identification: Connection closed by remote host

文章目录 1. 背景介绍2. 排查和解决方案 1. 背景介绍 Github提交或者拉取代码时,报错如下: Kex_exchange_identification: Connection closed by remote host fatal: Could not read from remote repository.Please make sure you have the correct ac…...

LabVIEW在CRIO中串口通讯数据异常问题

排查与解决步骤 检查硬件连接: 确保CRIO的串口模块正确连接,并且电缆无损坏。 确认串口模块在CRIO中被正确识别和配置。 验证串口配置: 在LabVIEW项目中,检查CRIO目标下的串口配置,确保波特率、数据位、停止位和校验…...

ALTERA芯片解密FPGA、CPLD、PLD芯片解密解密

‌Altera是世界一流的FPGA、CPLD和ASIC半导体生产商,所提供的解决方案与传统DSP、ASSP和ASIC解决方案相比,缩短了产品面市时间,提高了性能和效能,降低了系统成本。针对Altera芯片解密,益臻芯片解密中心经过多年的芯片解…...

[RK3588-Android12] 关于如何取消usb-typec的pd充电功能

问题描述 RK3588取消usb-typec的pd充电功能 解决方案: 在dts中fusb302节点下usb_con: connector子节点下添加如下熟悉: 打上如下2个补丁 diff --git a/drivers/usb/typec/tcpm/tcpm.c b/drivers/usb/typec/tcpm/tcpm.c index c8a4e57c9f9b..173f8cb7…...

分布式 I/O 系统 BL200 Modbus TCP 耦合器

BL200 耦合器是一个数据采集和控制系统,基于强大的 32 位微处理器设计,采用 Linux 操作系统,支持 Modbus 协议,可以快速接入现场 PLC、SCADA 以及 ERP 系统, 内置逻辑控制、边缘计算应用,适用于 IIoT 和工业…...

Java面试题--JVM大厂篇之Serial GC在JVM中有哪些优点和局限性

目录 引言: 正文: 一、Serial GC概述 二、Serial GC的优点 三、Serial GC的局限性 结束语: 引言: 在Java虚拟机(JVM)中,垃圾收集器(Garbage Collector, GC)是关键组件之一,负责自动管理内…...

【人工智能】机器学习 -- 贝叶斯分类器

目录 一、使用Python开发工具,运行对iris数据进行分类的例子程序NaiveBayes.py,熟悉sklearn机器实习开源库。 1. NaiveBayes.py 2. 运行结果 二、登录https://archive-beta.ics.uci.edu/ 三、使用sklearn机器学习开源库,使用贝叶斯分类器…...

深入理解 React 的 useSyncExternalStore Hook

深入理解 React 的 useSyncExternalStore Hook 大家好,今天我们来聊聊 React 18 引入的一个新 Hook:useSyncExternalStore。这个 Hook 主要用于与外部存储同步状态,特别是在需要确保状态一致性的场景下非常有用。本文将深入探讨这个 Hook 的…...

河南萌新联赛2024第(一)场:河南农业大学

C-有大家喜欢的零食吗_河南萌新联赛2024第&#xff08;一&#xff09;场&#xff1a;河南农业大学 (nowcoder.com) 思路:匈牙利算法的板子题. 二部图 int n; vector<int> vct[505]; int match[505],vis[505]; bool dfs(int s){for(auto v:vct[s]){if(vis[v]) continue;…...

K8S 上部署 Emqx

文章目录 安装方式一&#xff1a;1. 快速部署一个简单的 EMQX 集群&#xff1a;2. 部署一个持久化的 EMQX 集群&#xff1a;3. 部署 EMQX Edge 集群和 EMQX 企业版集群&#xff1a; 安装方式二&#xff1a;定制化部署1. 使用 Pod 直接部署 EMQX Broker2. 使用 Deoloyment 部署 …...

[React]利用Webcomponent封装React组件

[React]利用Webcomponent封装React组件 为什么这么做 我个人认为&#xff0c;最重要的点是可以很方便地跨框架挂载和卸载wc元素&#xff08;至少我在项目里是这么玩的&#xff09;&#xff0c;此外&#xff0c;基于wc的css沙箱以及它的shadowRoot机制&#xff0c;可以提供一套…...

从零实现手眼标定:Python+Realsense+JAKA实战与四元数、欧拉角、旋转矩阵转换详解

1. 手眼标定基础概念与实战准备 手眼标定是机器人视觉引导中的核心环节&#xff0c;简单来说就是确定相机"眼睛"和机械臂"手"之间的相对位置关系。想象一下&#xff0c;当你闭着眼睛摸鼻子时&#xff0c;大脑需要知道手和鼻子的相对位置——机器人系统同样…...

3步精通哔哩下载姬:零基础掌握B站视频高效下载与管理全攻略

3步精通哔哩下载姬&#xff1a;零基础掌握B站视频高效下载与管理全攻略 【免费下载链接】downkyi 哔哩下载姬downkyi&#xff0c;哔哩哔哩网站视频下载工具&#xff0c;支持批量下载&#xff0c;支持8K、HDR、杜比视界&#xff0c;提供工具箱&#xff08;音视频提取、去水印等&…...

Fish Speech 1.5入门指南:无需Python基础,5步完成高质量语音生成

Fish Speech 1.5入门指南&#xff1a;无需Python基础&#xff0c;5步完成高质量语音生成 你是不是也遇到过这些烦恼&#xff1f;想给视频配音&#xff0c;但自己的声音不好听&#xff0c;找配音员又太贵&#xff1b;想制作有声书&#xff0c;但录制过程繁琐&#xff0c;效果还…...

【Linux信号】Linux进程信号(上):信号产生方式和闹钟

&#x1f3ac; 个人主页&#xff1a;艾莉丝努力练剑❄专栏传送门&#xff1a;《C语言》《数据结构与算法》《C/C干货分享&学习过程记录》 《Linux操作系统编程详解》《笔试/面试常见算法&#xff1a;从基础到进阶》《Python干货分享》⭐️为天地立心&#xff0c;为生民立命…...

AI 与大模型相关

一、 AI 与大模型相关 1.1 Agent&#xff08;智能体&#xff09; 定义&#xff1a;具备自主规划、工具调用、记忆管理、任务执行能力的 AI 实体&#xff0c;能主动完成复杂目标。 核心能力&#xff1a;拆解任务、调用 API / 工具、自主决策、持久记忆、后台执行。 区别&am…...

深入OpenBMC散热控制:从IPMI命令到D-Bus,揭秘手动与自动模式切换

深入OpenBMC散热控制&#xff1a;从IPMI命令到D-Bus&#xff0c;揭秘手动与自动模式切换 在数据中心和服务器运维领域&#xff0c;散热控制一直是系统稳定性的关键因素。OpenBMC作为开源基板管理控制器&#xff0c;其散热管理机制直接影响到服务器的可靠性和能效比。本文将带您…...

手把手教你用RTABMAP+T265在Windows10上实现室内三维扫描(含标定技巧)

手把手教你用RTABMAPT265在Windows10上实现高精度室内三维扫描 第一次接触室内三维扫描时&#xff0c;我被这项技术深深吸引——它能让物理空间瞬间数字化&#xff0c;就像给现实世界按下"CtrlC"。但真正动手配置RTABMAP和T265相机时&#xff0c;才发现这条路并不平坦…...

计算机毕业设计springboot校园互助平台 基于SpringBoot的高校学生互助服务系统 SpringBoot框架下的校园协同帮助平台

计算机毕业设计springboot校园互助平台3m6f99 &#xff08;配套有源码 程序 mysql数据库 论文&#xff09;本套源码可以先看具体功能演示视频领取&#xff0c;文末有联xi 可分享近年来&#xff0c;随着互联网技术的蓬勃发展和智慧校园建设的深入推进&#xff0c;高校学生对于便…...

自适应混沌粒子群优化算法在PID参数整定中的应用:高效控制策略的代码详解与模型分享

自适应混沌粒子群整定PID/ACPSO-PID/PID参数整定 ACPSO&#xff08;自适应混沌粒子群优化&#xff09;整定PID&#xff08;比例-积分-微分控制器&#xff09;是一种高效的控制参数优化方法。 它利用粒子群优化&#xff08;PSO&#xff09;的基本框架&#xff0c;同时融入混沌理…...

ArcGIS Desktop许可证被占满?别慌,这3个方法帮你快速释放Advanced许可(附详细步骤)

ArcGIS Desktop高级许可被占用&#xff1f;3种高效解决方案与实战技巧 当你正在赶制项目报告或处理关键地理数据时&#xff0c;突然弹出的"All ArcGIS for Desktop Advanced licenses are in use"错误提示足以让任何GIS专业人士心跳加速。这种情况往往发生在团队共享…...