java设计模式:02-01-单例模式

单例模式(Singleton Pattern)

单例模式(Singleton Pattern)确保一个类只有一个实例,并提供一个全局访问点来访问该实例。单例模式通常用于需要全局唯一实例的场景,例如:

  • 日志记录(Logging):应用程序中的所有组件都需要记录日志,单例模式可以确保日志记录器的唯一实例。
  • 配置管理(Configuration Management):配置文件的读取和写入需要全局唯一实例,以避免不同组件之间的配置不一致。
  • 连接池(Connection Pooling):数据库连接池需要管理有限数量的连接实例,单例模式可以确保连接池的唯一实例。
  • 缓存(Caching):全局缓存需要唯一实例,以便于所有组件共享缓存数据。
  • 线程池(Thread Pool):线程池需要全局唯一实例,以确保系统中只有一个线程池在管理线程。

单例模式的多种实现方式

1. 饿汉式(Eager Initialization)

思想:在类加载时就创建单例实例,避免了多线程问题,但如果实例占用资源较大且不一定会用到,会造成资源浪费。

实现方式

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

优点

  • 实现简单。
  • 类加载时创建实例,线程安全。

缺点

  • 如果单例实例占用资源较大且未使用,会造成资源浪费。
2. 懒汉式(Lazy Initialization)

思想:在第一次需要实例时创建,避免资源浪费,但需要处理多线程问题。

实现方式

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

优点

  • 实例在第一次使用时创建,节省资源。

缺点

  • 需要加锁以确保线程安全,性能开销较大。
3. 双重检查锁定(Double-Checked Locking)

思想:结合饿汉式和懒汉式的优点,第一次检查实例是否为 null,避免不必要的同步,提高性能。

实现方式

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

优点

  • 提高了懒汉式的性能,减少同步开销。

缺点

  • 代码较为复杂。
4. 静态内部类(Bill Pugh Singleton)

思想:利用类加载机制,只有在使用时才加载内部类,从而实现延迟加载和线程安全。

实现方式

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

优点

  • 实现简单。
  • 线程安全。
  • 延迟加载。

缺点

  • 无法进行细粒度控制。
5. 枚举单例(Enum Singleton)

思想:使用 Java 枚举类型的特性,枚举类的实例天生是单例。

实现方式

public enum SingletonEnum {INSTANCE;public void someMethod() {// some method}
}

优点

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

缺点

  • 枚举类型不灵活,无法进行细粒度控制。

总结

实现方式优点缺点
饿汉式(Eager Initialization)实现简单,线程安全可能造成资源浪费
懒汉式(Lazy Initialization)实例在第一次使用时创建,节省资源需要加锁以确保线程安全,性能开销较大
双重检查锁定(Double-Checked Locking)提高了懒汉式的性能,减少同步开销代码较为复杂
静态内部类(Bill Pugh Singleton)实现简单,线程安全,延迟加载无法进行细粒度控制
枚举单例(Enum Singleton)实现最简单,线程安全,防止反序列化创建新实例枚举类型不灵活,无法进行细粒度控制

不同的实现方式各有优劣,选择哪种实现方式应根据具体的应用场景和需求来决定。如果需要简单而且线程安全的实现,枚举单例是一个很好的选择。如果需要延迟加载且线程安全,静态内部类和双重检查锁定都是不错的选择。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[Spring Boot]Protobuf解析MQTT消息体

简述 本文主要针对在MQTT场景下,使用Protobuf协议解析MQTT的消息体 Protobuf下载 官方下载 https://github.com/protocolbuffers/protobuf/releases网盘下载 链接:https://pan.baidu.com/s/1Uz7CZuOSwa8VCDl-6r2xzw?pwdanan 提取码:an…

【毕业论文】| 基于Unity3D引擎的冒险游戏的设计与实现

📢博客主页:肩匣与橘 📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 📢本文由肩匣与橘编写,首发于CSDN🙉 📢生活依旧是美好而又温柔的,你也…

mysql + Oracle

eg627. 变更性别 Salary 表: ----------------------- | Column Name | Type | ----------------------- | id | int | | name | varchar | | sex | ENUM | | salary | int | ----------------------- id 是这个表…

SetPriorityClass 函数潜在得32MB工作集内存限制

MSDN: SetPriorityClass function (processthreadsapi.h) - Win32 apps | Microsoft Learn 当人们调用 SetPriorityClass 函数并且将 “dwPriorityClass” 参数设置为:PROCESS_MODE_BACKGROUND_BEGIN 时。 应用程序得工作集(Working Set&…

小程序-4(自定义组件:数据、属性、数据监听器、生命周期函数、插槽、父子通信、behaviors)

目录 1.组件的创建和引用 局部引用组件 全局引用组件 组件和页面的区别 组件样式隔离 ​编辑 组件样式隔离的注意点 修改组件的样式隔离选项 data数据 methods方法 properties属性 data和properties属性的区别 使用setData修改properties的值 2.数据监听器 什么…

昇思25天学习打卡营第19天|MindNLP ChatGLM-6B StreamChat

文章目录 昇思MindSpore应用实践ChatGML-6B简介基于MindNLP的ChatGLM-6B StreamChat Reference 昇思MindSpore应用实践 本系列文章主要用于记录昇思25天学习打卡营的学习心得。 ChatGML-6B简介 ChatGLM-6B 是由清华大学和智谱AI联合研发的产品,是一个开源的、支持…

数据结构——线性表(循环链表)

一、循环链表定义 将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一 个环,这种头尾相接的单链表称为单循环链表,简称循环链表(circular linked list)。 循环链表解决了一个很麻烦的问题。如何从当中一 个结点出发&am…

如何看待“微软蓝屏”冲上热搜,Windows系统电脑死机?

微软蓝屏事件席卷全球,Windows系统遭遇重大挑战 近日,一则关于微软蓝屏的新闻在各大社交媒体平台上迅速传开,并登上热搜榜首。全球多地报告称Windows系统电脑出现死机、蓝屏现象,引发了广泛关注。 一、事件概述 据报道,此次微软蓝屏事件始于当地时间2024年7月19日,美国…

vs code中多个c文件的编译、调试,对应的task.json/launch.json文件的设置

目录 0. 容易犯的错误 1. 编译:需要修改原始task.json文件,修改处用加粗表示 2. 调试:需修改launch.json文件 3. 完整配置流程参考 0. 容易犯的错误 注意,不能在同一个文件夹下写两个都包含main()函数的.c文件,这会…

IO多路复用-poll的使用详解【C语言】

1.什么是poll poll 是一种用于监控多个文件描述符状态的系统调用,它可以等待多个文件描述符上的事件发生。它与 select 和 epoll 类似,但在某些场景下使用更为方便。 poll的机制与select类似,与select在本质上没有多大差别,使用…

oops使用笔记

oops-plugin-excel-to-json 使用 gitee上的文档图片不可见 参考 > https://forum.cocos.org/t/topic/156800 配置,打开“项目设置”,拖动到最下面,有一个"Excel to Json",前3项采用默认配置吧Excel, 默认的Excel目录是与assets平级的excel目…

如何确定企业信息系统的安全保护等级

确定企业信息系统的安全保护等级通常需要考虑以下几个方面: 1. 业务信息安全 - 系统所处理的业务数据的重要性、敏感性和保密性。例如,涉及国家机密、商业机密、个人隐私的数据通常具有较高的安全要求。 - 数据遭到破坏、泄露或篡改后对企业、社会或国家…

xinput1-3.dll文件丢失找不到的修复方法

在电脑使用过程中,遇到“xinput1-3.dll丢失”或“找不到xinput1-3.dll”这类错误提示,可能会导致某些游戏或应用程序无法正常运行。以下是修复步骤,帮助您快速找回缺失的dll文件。 一、xinput1-3.dll的作用 xinput1-3.dll是Microsoft Direct…

Android APP 基于RecyclerView框架工程(知识体系积累)

说明:这个简单的基于RecyclerView的框架作用在于自己可以将平时积累的一些有效demo整合起来(比如音视频编解码的、opengles的以及其他也去方向的、随着项目增多,工程量的增加,后期想高效的分析和查找并不容易)&#xf…

Oracle 12c新特性 In-Memory Column Store

Oracle 12c引入了一项重要的特性——In-Memory Column Store(简称IM或In-Memory),这一特性极大地提升了数据库在处理分析型查询时的性能。以下是关于Oracle 12c In-Memory特性的详细介绍: 一、基本概念 In-Memory Column Store&…

1.Fabric框架

要了解Fabric,首先要知道Hyperledger开源项目。 2015年12月,由开源世界的旗舰组织Linux基金会牵头,30家初始企业成员共同宣布Hyperledger联合项目成立。Hyperledger 超级账本,是首个面向企业应用场景的分布式账本平台&#xff0c…

【每日一练】python编写一个简易计算器

程序代码: #循环语句,条件为真所以循环执行 while True: #定义两个数的变量和运算符号 num1 float(input("第一个数:")) num2 float(input("第一个数:")) syminput("选择运算符 - * /:") #判断运算符号 …

防火墙的经典体系结构及其具体结构

防火墙的经典体系结构及其具体结构 防火墙是保护计算机网络安全的重要设备或软件,主要用于监控和控制进出网络流量,防止未经授权的访问。防火墙的经典体系结构主要包括包过滤防火墙、状态检测防火墙、代理防火墙和下一代防火墙(NGFW&#xf…

Camera Raw:评级和标签

在 Camera Raw 中,评级 Rating和标签 Label功能为摄影师和图像编辑者提供了一种高效的图像组织和管理方法。通过这些功能,用户可以轻松地对照片进行分类、标记和筛选,以便在大量图像中快速找到需要的照片。 ◆ ◆ ◆ 设置星级 Set Rating 星…

Inconsistent Query Results Based on Output Fields Selection in Milvus Dashboard

题意:在Milvus仪表盘中基于输出字段选择的不一致查询结果 问题背景: Im experiencing an issue with the Milvus dashboard where the search results change based on the selected output fields. Im working on a RAG project using text data conv…