设计模式---单例模式
目录一、什么是单例模式二、单例模式实现1.饿汉式2.懒汉式3.懒汉式和饿汉式区别3.1 实例化对象的时机3.2线程安全4.双重检查5.单例模式范围三、理解单例模式1.延迟加载的思想2.缓存的思想3.枚举和单例4.单例模式的本质一、什么是单例模式单例模式是一种对象创建型模式使用单例模式 可以保证为一个类只生成唯一的实例对象。也就是说 在整个程序空间中该类只存在一个实例对象。GoF对单例模式的定义是保证一个类、 只有一个实例存在同时提供能对该实例加以访问的全局访问方法。二、单例模式实现实现一个单例有两点注意事项①将构造器私有不允许外界通过构造器创建对象②通过公开的静态方法向外界返回类的唯一实例。1.饿汉式public class Singleton { //构造函数私有化在内部控制创建实例的数目 private Singleton(){} //类加载时初始化实例对象 private static Singleton instance new Singleton(); ////提供一个全局的静态方法 public static Singleton getInstance(){ //直接使用创建好的实例 return instance; } }2.懒汉式public class Singleton { //定义一个变量存储创建好的实例变量要在静态方法中使用所以加上static private static Singleton instance null; //构造函数私有化在内部控制创建实例的数目 private Singleton() {} //提供一个全局的静态方法为客户端提供类实例 public static Singleton getInstance(){ //判断如果没有实例对象则创建并返回如果有则直接返回 if (instance null) { instance new Singleton(); } return instance; } }3.懒汉式和饿汉式区别3.1 实例化对象的时机饿汉式在类加载时实例化对象可能会耗费资源空间懒汉式在使用时实例化对象延迟加载每次使用时都要判断实例对象是否为空耗费时间。3.2线程安全饿汉式可以保证只返回一个实例线程安全因为虚拟机保证了只加载一次不加同步的懒汉式在多线程下无法保证只返回一个实例上面的示例中无法保证。因为在线程1进入判断时如果singleton为null则初始化该实例new Singleton()若在初始化时间内线程2也进入判断此时线程1没有初始化完成则线程2同样会初始化实例new Singleton()。解决方式使用synchronized关键字使方法同步此时new Singleton()永远只会执行一次。public class Singleton { private static Singleton instance null; //构造函数私有化 private Singleton() {} //提供一个全局的静态方法使用同步方法 public static synchronized Singleton getInstance(){ //判断如果没有实例对象则创建并返回如果有则直接返回 if (instance null) { instance new Singleton(); } return instance; } }4.双重检查但是我们并不需要把整个getInstance()方法都锁住而只需要锁住new Singleton()方法即可所谓双重检查指的是并不是每次进入getInstance方法都需要同步而是先不同步进入方法过后先检查实例是否存在如果不存在才进入下面的同步块这是第一重检查进入同步块之后再次检查实例是否存在如果不存在就在同步的情况下创建一个实例这是第二重检查。这样就只需要同步一次减少了多次在同步情况下进行判断所浪费的时间。双重检查的实现会使用一个关键字volatile被volatile修饰的变量的值将不会被本地线程缓存所有对该变量的读写都是直接操作共享内存从而确保多个线程能正确的处理该变量。public class Singleton { private volatile static Singleton instance null; //构造函数私有化 private Singleton() {} //提供一个全局的静态方法使用同步方法 public static synchronized Singleton getInstance(){ //判断如果没有实例对象则创建并返回如果有则直接返回 if (instance null) { synchronized (Singleton.class) { if(instance null) { instance new Singleto4(); } } } return instance; } }5.单例模式范围是一个ClassLoader及其子ClassLoader的范围一般情况下一个虚拟机只有一个ClassLoader三、理解单例模式1.延迟加载的思想就是一开始不加载资源或数据等到使用时才去加载也称lazy load目的是尽可能节约资源。2.缓存的思想如果某些资源或数据会被频繁使用可以把数据缓存到内存里面每次操作的时候先到内存里面找看是否有数据如果有就直接使用如果没有就获取它并设置到缓存中下次访问时就可以直接获取。目的是空间换时间节省时间。import java.util.HashMap; import java.util.Map; /** * Author: Zhang * Date: 2019/9/2 12:01 * Description: 使用缓存模拟实现单例 */ public class SingletonCache { /** * 定义一个缺省的key前缀 */ private final static String DEFAULT_KEY cache; /** * 缓存实例的容器 */ private static MapString,SingletonCache map new HashMap(); /** * 私有构造方法 */ private SingletonCache(){} /** * 提供能对该实例加以访问的全局访问方法 * return */ public static SingletonCache getInstance(){ //先从容器中获取 SingletonCache singletonCache map.get(DEFAULT_KEY); //如果实例为空则创建实例并放到容器中 if(singletonCache null){ singletonCache new SingletonCache(); map.put(DEFAULT_KEY,singletonCache); } return singletonCache; } }3.枚举和单例单元素的枚举类型已经成为实现Singleton的最佳方法1枚举类型实质上是功能齐全的类可以有自己的属性和方法2枚举类型的基本思想通过公有的静态final域为每个枚举常量导出实例的类3从某个角度讲枚举的单例是泛型化本质上是单元素的枚举用枚举来实现单例只需要写一个包含单个元素的枚举类型即可/** * Author: Zhang * Date: 2019/9/2 11:45 * Description: 使用枚举来实现单例模式 */ public enum Singleton { /** * 定义一个枚举元素就代表Singleton的一个实例 */ SingletonInstance; /** * 自己的操作方法 */ public void operSingleton(){ //功能处理 System.out.println(SingletonInstance Singleton.SingletonInstance); } public static void main(String[] args) { for(int i 0;i3;i){ Singleton.SingletonInstance.operSingleton(); } } }4.单例模式的本质本质控制实例数目扩展示例控制实例数目为3import java.util.HashMap; import java.util.Map; /** * Author: Zhang * Date: 2019/9/2 11:23 * Description: */ public class SingletonExtend { /** * 定义一个缺省的key前缀 */ private final static String DEFAULT_KEY cache; /** * 缓存实例的容器 */ private static MapString,SingletonExtend map new HashMap(); /** * 用来记录当前正在使用第几个实例到了控制的最大数目就返回从1开始 */ private static int num 1; /** * 定义控制实例的最大数目(可从配置文件中读取) */ private final static int MAX_NUM 3; /** * 私有构造方法 */ private SingletonExtend(){} /** * 提供能对该实例加以访问的全局访问方法 * return */ public static SingletonExtend getInstance(){ String key DEFAULT_KEY num; SingletonExtend singletonExtend map.get(key); //如果实例为空则创建实例并放到容器中 if(singletonExtend null){ singletonExtend new SingletonExtend(); map.put(key,singletonExtend); } //把当前实例的序号加1 num; //如果实例的序目达到最大数目了就返回从1开始 if(num MAX_NUM){ num 1; } return singletonExtend; } public static void main(String[] args) { SingletonExtend singletonExtend1 getInstance(); SingletonExtend singletonExtend2 getInstance(); SingletonExtend singletonExtend3 getInstance(); SingletonExtend singletonExtend4 getInstance(); SingletonExtend singletonExtend5 getInstance(); SingletonExtend singletonExtend6 getInstance(); System.out.println(singletonExtend1singletonExtend1); System.out.println(singletonExtend2singletonExtend2); System.out.println(singletonExtend3singletonExtend3); System.out.println(singletonExtend4singletonExtend4); System.out.println(singletonExtend5singletonExtend5); System.out.println(singletonExtend6singletonExtend6); } }

相关新闻

基于Docker Compose的Apache Doris集群极简部署与配置指南

基于Docker Compose的Apache Doris集群极简部署与配置指南

最近在搞数据仓库选型,Doris 凭借其极致的查询性能和易用性逐渐成为许多团队的首选。然而,从官网下载、编译到部署,对于刚接触的开发者来说,步骤繁琐且容易踩坑。尤其是在异构的服务器环境中,依赖冲突、端口占用、配置错误等问题层出不穷,往往需要耗费大量时间排查。 本…

2026/7/28 16:18:55 阅读更多 →
Redis 系列-- SpringBoot中redisTemplate   的操作(四)

Redis 系列-- SpringBoot中redisTemplate 的操作(四)

SpringBoot中 集成 redisTemplate 对 Redis 的操作(四)HSet redis 数据结构中,set用于去重,hset 则用于 去重加排序.在hset 中,有两个概念: 1⃣️ rank 集合的下标 2⃣️score 集合排序的依据值 下面就来说…

2026/7/28 16:18:55 阅读更多 →
求助大神们

求助大神们

这里写自定义目录标题 有没有wordpress上可用的万能视频插件啊!有的话可以联系我 扣 扣:4411326 V心同步!!谢谢了

2026/7/28 16:18:55 阅读更多 →

最新新闻

OBS多路推流插件终极指南:如何一键实现多平台直播同步

OBS多路推流插件终极指南:如何一键实现多平台直播同步

OBS多路推流插件终极指南:如何一键实现多平台直播同步 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否在为每次直播都要重复设置不同平台而感到烦恼?现在&…

2026/7/28 16:45:36 阅读更多 →
最多的比赛场次--贪心入门?

最多的比赛场次--贪心入门?

这里的输出结果为1.再举个例子输入 4 2 1 3 2 5 输出 2说明:如果选择(1,3)那么剩下2和5不能比,只有一场 所以选择(1,2)和(3,5)可以打两场比赛思路…

2026/7/28 16:45:36 阅读更多 →
终极文件编码检测工具:一键解决乱码问题的完整指南

终极文件编码检测工具:一键解决乱码问题的完整指南

终极文件编码检测工具:一键解决乱码问题的完整指南 【免费下载链接】EncodingChecker A GUI tool that allows you to validate the text encoding of one or more files. Modified from https://encodingchecker.codeplex.com/ 项目地址: https://gitcode.com/gh…

2026/7/28 16:45:36 阅读更多 →
必备Linux命令和C语言基础

必备Linux命令和C语言基础

系统信息 arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统部件 - (SMBIOS / DMI) hdpARM -i /dev/hda 罗列一个磁盘的架构特性 hdparm -tT /dev/sda 在磁盘上执行测试性读取操作 cat /proc/cpuinfo…

2026/7/28 16:45:36 阅读更多 →
深度解析webgcode:浏览器集成的CNC铣床终极指南

深度解析webgcode:浏览器集成的CNC铣床终极指南

深度解析webgcode:浏览器集成的CNC铣床终极指南 【免费下载链接】webgcode Online G-Code simulator, controller code for STM32F4-Discovery and google chrome extension to send the code to it. 项目地址: https://gitcode.com/gh_mirrors/we/webgcode …

2026/7/28 16:45:36 阅读更多 →
代码生成模型评测:非单调成功-努力曲线现象解析

代码生成模型评测:非单调成功-努力曲线现象解析

1. 先搞清楚 Opus 5 和 FrontierCode 到底在测什么看到“非单调成功-努力曲线”这个标题,第一反应可能是“这又是什么新模型或新框架”。但实际拆开看,Opus 5 和 FrontierCode 都不是通用大模型或开发工具,而是专门用于代码生成能力评测的基准…

2026/7/28 16:44:36 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻