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

设计模式简述(二)单例模式

单例模式

  • 描述
  • 基本使用
    • 防破坏单例
    • 饿汉式
    • 懒汉式
    • 有上限多例

描述

一个类全局只有一个实例,自行实例化并提供给使用。
构造函数私有化是前提

基本使用

防破坏单例

  • 防反射:在构造函数中判断类中实例是否已初始化
private InnerClassSingleton (){if(InnerClassSingletonHolder.instance != null){throw new RuntimeException("单例模式 不允许 多例存在");}
}
  • 防克隆:单例类不要实现Cloneable接口或者强制覆盖clone方法
    如果采用的是强制覆盖clone方法,可以返回单例对象或者 直接报错
  • 防序列化:对象反序列化会调用对象的readResolve方法,可以在类中声明这个方法,并返回单例对象
    Object readResolve() throws ObjectStreamException{return InnerClassSingletonHolder.instance;}

饿汉式

  • 静态成员初始化
public class HungrySingleton {private static HungrySingleton instange = new HungrySingleton();private HungrySingleton() {if (instange != null) {throw new RuntimeException("单例模式不允许 多例存在");}}public static HungrySingleton getInstance() {return instange;}
}
  • 静态代码块初始化
public class HungrySingleton {private static HungrySingleton instange;static {instange = new HungrySingleton();}private HungrySingleton() {if (instange != null) {throw new RuntimeException("单例模式不允许 多例存在");}}public static HungrySingleton getInstance() {return instange;}
}
  • 枚举(直接用吧JVM层面保证单例)
/*** @author sdaf* <p>* 枚举:本质也是一个类,底层是一个实现 Eunm 的一个类,编译器会默认添加一些属性及方法* 枚举站在单例实现角度上看 就是一个饿汉模式实现*/
public enum EnumSingleton {INSTANGE;public void test(){// code}
}

懒汉式

  • synchronized + double check
public class LazySingleton {private static volatile LazySingleton lazySingleton;private LazySingleton() {if(lazySingleton!=null){throw new RuntimeException("单例模式不允许 多例存在");}}public static LazySingleton getInstance() {if (lazySingleton == null) {// 线程A 线程B 均进入非空判断逻辑// 线程A 先行添加锁,然后创建实例对象,并返回// 此时线程B已经 进入非空的逻辑,然后依然会去加锁,然后创建对象,此时就违背了单例对象定义// 所以需要在加锁的内部再次进行非空判断,保证对象单例synchronized (LazySingleton.class) {if (lazySingleton == null) {try {Thread.sleep(200);} catch (InterruptedException e) {e.printStackTrace();}lazySingleton = new LazySingleton();// new 一个对象步骤进一步解析// 1、在堆内存开辟一块空间// 2、初始化对象(创建对象)// 3、将开辟的内存空间地址赋值给变量// 【但是】由于编译器和CPU的指令重排可能导致 2 和 3 执行顺序发生改变// 为 1 3 2// 此时如果第二个线程 在 第一个线程执行到 3 与 2之间时 进来// instance 是有值的,因为 instance 拿到的只是 内存地址而已,并不知道这个地址上是否实在的对象// 只有当这个对象完成初始化(创建)后这个地址上才有具体的值// 此时第二个线程拿到地址就会直接返回这个引用,// 但是此时这个对象是个 null , 可能会引起 NullPointerException// 为了防止 整个 new 操作被执行重排 需要使用关键字 volatile 来修饰变量}}}return lazySingleton;}
  • 静态内部类
/*** @author sdaf* @Description 基于静态内部类的单例模式,也是一种懒加载* 也是借助于JVM类加载机制实现的线程安全* 类加载顺序:* 1.加载类的Class文件到内存中* 2.连接JVM,验证Class合法性,静态成员赋默认值,解析处理后的数据* 3.给静态成员赋值* 静态内部类只有在使用这个类的时候才会去加载这个类*/
public class InnerClassSingleton implements Serializable{private static final long serialVersionUID = -790330830636259886L;private static class InnerClassSingletonHolder{private static InnerClassSingleton instance= new InnerClassSingleton();}private InnerClassSingleton (){if(InnerClassSingletonHolder.instance != null){throw new RuntimeException("单例模式 不允许 多例存在");}}public static InnerClassSingleton getInstance(){return InnerClassSingletonHolder.instance;}
//Object readResolve() throws ObjectStreamException{return InnerClassSingletonHolder.instance;}
}

有上限多例

单例模式可以扩展为有上限多例

public class Multiton {private Multiton() {}private static final int MAX_INSTANCES = 3;private static final List<Multiton> instances = new ArrayList<>();// 饿汉式初始化static {for (int i = 0; i < MAX_INSTANCES; i++) {instances.add(new Multiton());}}// 懒汉式初始化public static Multiton getInstanceLazy(int index) {if (instances.get(index) == null) {synchronized (Multiton.class) {if (instances.get(index) == null) {instances.set(index, new Multiton());}}}return instances.get(index);}// 随机获取public static Multiton getRandomInstance() {Random random = new Random();return instances.get(random.nextInt(MAX_INSTANCES));}// 指定获取public static Multiton getInstance(int index) {if (index < 0 || index >= MAX_INSTANCES) {throw new IllegalArgumentException("索引超出范围");}return instances.get(index);}// 业务方法public void test() {}
}

相关文章:

设计模式简述(二)单例模式

单例模式 描述基本使用防破坏单例饿汉式懒汉式有上限多例 描述 一个类全局只有一个实例&#xff0c;自行实例化并提供给使用。 构造函数私有化是前提 基本使用 防破坏单例 防反射&#xff1a;在构造函数中判断类中实例是否已初始化 private InnerClassSingleton (){if(Inn…...

区块链钱包:与主流钱包APP的区别

前言 在前端开发者速入:DApp中的前端要干些什么?文中我简单讲解了在DApp中前端开发者要干的是什么,本来在接下来的内容中我应该继续讲解在DApp中前端开发者的一系列工作和其他所要用到的技术栈,但是为了方便后续的讲解,我们这里不得不提及一下在区块链中让无数人又爱又恨…...

23种设计模式-行为型模式-中介者

文章目录 简介问题解决代码架构优势 总结 简介 中介者是一种行为设计模式&#xff0c; 能让你减少对象之间混乱无序的依赖关系。该模式会限制对象之间的直接交互&#xff0c;强制让它们通过一个中介者对象进行合作。 问题 假如你有一个创建和修改用户资料的对话框&#xff0…...

mysql数据库中getshell的方式总结

mysql数据库中getshell的方式总结 MySQL版本大于5.0&#xff0c;MySQL 5.0版本以上会创建日志文件,我们通过修改日志文件的全局变量,就可以GetSHELL,下面这篇文章主要给大家介绍了关于mysql数据库中getshell的方式,需要的朋友可以参考下 outfile和dumpfile写shell 利用条件 …...

神经网络基础

神经网络的基本组成元素 一个神经元&#xff1a; 单层神经网络&#xff1a; 多层神经网络&#xff1a;&#xff08;前向计算&#xff09; 为什么要使用激活函数 如果不使用激活函数&#xff0c;每层只对上层的输入进行线性变换&#xff0c;实际这些线性变换可以归为一层即可。…...

Redis的公共操作命令

目录 1.Key操作命令1.1 keys *1.2 exists <key]>1.3 type <key>1.4 del <key>1.5 unlink <key>1.6 ttl <key>1.7 expire <key> <秒数>1.8 move <key> <index> 2.库操作命令2.1 select <index>2.2 dbsize2.3 flush…...

Redash:一个开源的数据查询与可视化工具

Redash 是一款免费开源的数据可视化与协作工具&#xff0c;可以帮助用户快速连接数据源、编写查询、生成图表并构建交互式仪表盘。它简化了数据探索和共享的过程&#xff0c;尤其适合需要团队协作的数据分析场景。 数据源 Redash 支持各种 SQL、NoSQL、大数据和 API 数据源&am…...

Transformer+BO-SVM多变量时间序列预测(Matlab)

TransformerBO-SVM多变量时间序列预测&#xff08;Matlab&#xff09; 目录 TransformerBO-SVM多变量时间序列预测&#xff08;Matlab&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 本期推出一期高创新模型&#xff0c;基于Transformer提取时序特征后输入S…...

【Redis】服务端高并发分布式结构

一、认识Redis Redis是开源的&#xff0c;用于存储数据的&#xff0c;在内存中存储数据。Redis被用作数据库&#xff0c;缓存&#xff0c;消息队列等一些作用。 在数据库的学习中&#xff0c;我们学习了MySQL&#xff0c;但是MySQL有一些大问题&#xff1a;其访问速度比较慢。在…...

C和C++(list)的链表初步

链表是构建其他复杂数据结构的基础&#xff0c;如栈、队列、图和哈希表等。通过对链表进行适当的扩展和修改&#xff0c;可以实现这些数据结构的功能。想学算法&#xff0c;数据结构&#xff0c;不会链表是万万不行的。这篇笔记是一名小白在学习时整理的。 C语言 链表部分 …...

第九课:LoRA模型的原理及应用

文章目录 Part.01 3种LoRA的使用方式Part.02 5种LoRA的应用方向Part.01 3种LoRA的使用方式 LoRA能够在家用级设备上训练,实现对Checkpoint在某些方面的微调使用Lora的三种方式:放置Lora模型到目录中,然后作为提示词的一部分输入。点击生成按钮下面的“画”,然后打开Additio…...

make_01_Program_07_$@ $^ 是什么含义

在 Makefile 中&#xff0c;$ 和 $^ 是自动变量&#xff0c;用于表示目标和依赖关系的特殊含义。它们常用于规则中的命令部分&#xff0c;以便简化 Makefile 的书写。 自动变量解析 $&#xff1a; $ 表示当前规则的目标文件名。换句话说&#xff0c;在一个特定的规则中&#x…...

CKPT文件是什么?

检查点&#xff08;Checkpoint&#xff0c;简称ckpt&#xff09;是一种用于记录系统状态或数据变化的技术&#xff0c;广泛应用于数据库管理、机器学习模型训练、并行计算以及网络安全等领域。以下将详细介绍不同领域中ckpt检查点的定义、功能和应用场景。 数据库中的ckpt检查点…...

YOLOv11训练教程:PyTorch与PyCharm在Windows 11下的完整指南

YOLOv11训练教程&#xff1a;PyTorch与PyCharm在Windows 11下的完整指南 介绍与引言 YOLO(You Only Look Once)是当前最流行的实时目标检测算法系列之一&#xff0c;YOLOv11作为该系列的最新演进版本&#xff0c;继承了YOLO家族高效、快速的特点&#xff0c;同时在精度和速度…...

使用MATIO库写入MATLAB结构体(struct)数据的示例程序

使用MATIO库写入MATLAB结构体(struct)数据的示例程序 MATIO是一个用于读写MATLAB数据文件(.mat)的开源C库。下面是一个完整的示例程序&#xff0c;展示如何使用MATIO库创建一个包含结构体数据的MAT文件。 示例程序 #include <stdio.h> #include <stdlib.h> #inc…...

【大模型深度学习】提示学习:Prefix tuning 、P-tuning v2、P-tuning 到底有什么区别?

Prefix tuning 、P-tuning v2、P-tuning还在傻傻分不清。 到底有什么区别&#xff0c;本文希望说明白这些区别&#xff0c;如有错误欢迎指出。 一、为什么需要提示学习&#xff1f; 从全参微调到参数高效微调&#xff08;PEFT&#xff09;,这些微调方法的思想都是重新训练模…...

多周期多场景的供应链优化问题 python 代码

这段代码是一个使用 Gurobi 优化器的混合整数规划(MIP)模型,用于解决一个多周期多场景的供应链优化问题。代码定义了一个名为 `MCCG` 的类,该类包含了多个方法,用于构建和解决主问题(Master Problem)、子问题(Subproblem)和子子问题(Sub-subproblem)。下面是对代码中…...

CCF GESP Python编程 一级认证真题 2025年3月

Python 一级 2025 年 03 月 题号 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 答案 D D B D D C B D C A B D C A A 一、单选题&#xff08;每题 2 分&#xff0c;共 30 分&#xff09; 第 1 题 2025年春节有两件轰动全球的事件&#xff0c;一个是DeepSeek横空出世&#xff0c;另一…...

python爬虫爬取淘宝热销(热门)男装商品信息(课程设计;提供源码、使用说明文档及相关文档;售后可联系博主)

TOC 本文仅为记录学习轨迹&#xff0c;如有侵权,联系删除 一、环境说明 使用前必须检查以下环境 &#xff08;1&#xff09;python编译环境 &#xff08;2&#xff09;python脚本执行所需要的库&#xff0c;具体看代码&#xff08;main.py&#xff09;import导入的部分库 &a…...

AntDesign下,Select内嵌Menu标签,做一个多选下拉框,既可以搜索,还可以选择下拉项

话不多说&#xff0c;直接上效果和代码 效果图一&#xff1a; 效果图二&#xff1a; renderAddStyleOption (item: any) > {const { value } this.props;const { currentSelectedOptionIds, currentStyleId } this.state;const styleSettings value?.styleSettings;c…...

15.1linux设备树下的platform驱动编写(知识)_csdn

上一章我们详细的讲解了 Linux 下的驱动分离与分层&#xff0c;以及总线、设备和驱动这样的驱动框架。基于总线、设备和驱动这样的驱动框架&#xff0c; Linux 内核提出来 platform 这个虚拟总线&#xff0c;相应的也有 platform 设备和 platform 驱动。 上一章我们讲解了传统的…...

【C++进阶五】list深度剖析

【C进阶五】list深度剖析 1.什么是list2.list的使用2.1构造函数2.2list迭代器2.3容量操作2.4增删查改 3.list迭代器失效4.迭代器类型5.list不能使用的算法库函数 1.什么是list STL标准库中的list是一个带头双向循环链表 和vector不同,list没有支持[ ]访问以及resize和reserve容…...

小刚说C语言刷题——第15讲 多分支结构

1.多分支结构 所谓多分支结构是指在选择的时候有多种选择。根据条件满足哪个分支&#xff0c;就走对应分支的语句。 2.语法格式 if(条件1) 语句1; else if(条件2) 语句2; else if(条件3) 语句3; ....... else 语句n; 3.示例代码 从键盘输入三条边的长度&#xff0c;…...

L2-024 部落 #GPLT,并查集 C++

文章目录 题目解读输入格式输出格式 思路Ac Code参考 题目解读 我们认为朋友的朋友都算在一个部落里&#xff0c;于是要请你统计一下&#xff0c;在一个给定社区中&#xff0c;到底有多少个互不相交的部落&#xff1f;并且检查任意两个人是否属于同一个部落。 输入格式 第一…...

【BFS最小步数】魔板题解

魔板题解 题目传送门 题目传送门 一、题目描述 Rubik先生发明了魔板的二维版本&#xff0c;这是一个有8个格子的板子&#xff0c;初始状态为&#xff1a; 1 2 3 4 8 7 6 5我们可以用三种操作来改变魔板状态&#xff1a; A&#xff1a;交换上下两行B&#xff1a;将最右边一…...

Qt之QHostInfo

简介 QHostInfo表示主机信息&#xff0c;即主机名称 常用接口 static QHostInfo fromName(const QString &name); QString hostName() const; QList<QHostAddress> addresses() const;结构 #mermaid-svg-HTJ95sEk8JwO4uCy {font-family:"trebuchet ms",…...

C++11观察者模式示例

该示例代码采用C11标准&#xff0c;解决以下问题&#xff1a; 消除了类继承的强耦合方式&#xff1b;通知接口使用可变参数模板&#xff0c;支持任意参数&#xff1b; 示例代码 .h文件如下&#xff1a; #include <functional> #include <string> #include <…...

解释观察者模式,如何实现观察者模式?

一、模式本质 观察者模式&#xff08;Observer Pattern&#xff09;建立​​对象间的一对多依赖关系​​&#xff0c;当核心对象&#xff08;Subject&#xff09;状态变化时&#xff0c;自动通知所有订阅者&#xff08;Observers&#xff09;。 这是一种​​推模型​​的典型…...

机器学习算法能够自动学习并使用不同条件下的变化趋势,确保预测结果的准确性的智慧地产开源了

智慧地产视觉监控平台是一款功能强大且简单易用的实时算法视频监控系统。它的愿景是最底层打通各大芯片厂商相互间的壁垒&#xff0c;省去繁琐重复的适配流程&#xff0c;实现芯片、算法、应用的全流程组合&#xff0c;从而大大减少企业级应用约95%的开发成本。 AI是新形势下数…...

【首款ARMv9开源芯片“星睿“O6测评】在“周易”NPU上部署Yolov8l模型并实现实时目标检测

博主未授权任何人或组织机构转载博主任何原创文章&#xff0c;感谢各位对原创的支持&#xff01; 博主链接 博客内容主要围绕&#xff1a; 5G/6G协议讲解 高级C语言讲解 Rust语言讲解 文章目录 在"星睿"O6的“周易”NPU上部署Yolov8l模型并实现…...

[ctfshow web入门] web4

前置知识 robots.txt是机器人协议&#xff0c;在使用爬虫爬取网站内容时应该遵循的协议。协议并不能阻止爬虫爬取&#xff0c;更像是一种道德规范。 假设robots.txt中写道 Disallow: /admind.php&#xff0c;那我就暴露了自己的后台&#xff0c;这属于信息泄漏&#xff0c;攻击…...

Golang的Goroutine(协程)与runtime

目录 Runtime 包概述 Runtime 包常用函数 1. GOMAXPROCS 2. Caller 和 Callers 3. BlockProfile 和 Stack 理解Golang的Goroutine Goroutine的基本概念 特点&#xff1a; Goroutine的创建与启动 示例代码 解释 Goroutine的调度 Gosched的作用 示例代码 输出 解…...

与Linux操作系统相关的引导和服务

目录 一.Linux操作系统引导过程 1.1引导过程总览 1.2系统初始化进程 1.2.1init进程 1.2.2sysmted 1.3systemd单元类型 二.排除启动类故障 2.1MBR扇区故障 2.1.1故障原因 2.1.2故障现象 2.1.3解决办法 2.1.4模拟修复MBR扇区故障 1)添加新的硬盘 2&#xff09;进行…...

JS API 事件监听

焦点事件案例&#xff1a;搜索框激活下拉菜单 事件对象 事件对象存储事件触发时的相关信息 可以判断用户按键&#xff0c;点击元素等内容 如何获取 事件绑定的回调函数中的第一个形参就是事件对象 一般命名为e,event 事件对象常用属性 type类型 click mouseenter client…...

【8】搭建k8s集群系列(二进制部署)之安装node节点组件(kubelet)

一、下载k8s二进制文件 下载地址&#xff1a; https://github.com/kubernetes/kubernetes/blob/master/CHANGELOG/CHANGELOG -1.20.md 注&#xff1a;打开链接你会发现里面有很多包&#xff0c;下载一个 server 包就够了&#xff0c;包含了 Master 和 Worker Node 二进制文件。…...

Harmony OS“一多” 详解:基于窗口变化的断点自适应实现

一、一多开发核心概念&#xff08;18N模式&#xff09; 目标&#xff1a;一次开发多端部署 解决的问题&#xff1a; 1、界面级一多&#xff1a;适配不同屏幕尺寸 2、功能级一多&#xff1a;设备功能兼容性处理(CanIUser) 3、工…...

Rust切片、结构体、枚举

文章目录 切片类型字符串切片其他结构的切片 结构体结构体实例元组结构体结构体所有权输出结构体结构体的方法结构体关联函数单元结构体 枚举match语法Option枚举类if let 语句 切片类型 切片&#xff08;Slice&#xff09;是对数据值的部分“引用” 我们可以从一个数据集合中…...

量子纠错码实战:从Shor码到表面码

引言&#xff1a;量子纠错的必要性 量子比特的脆弱性导致其易受退相干和噪声影响&#xff0c;单量子门错误率通常在10⁻~10⁻量级。量子纠错码&#xff08;QEC&#xff09;通过冗余编码测量校正的机制&#xff0c;将逻辑量子比特的错误率降低到可容忍水平。本文从首个量子纠错…...

Pod的生命周期

概念 Pod对象自从其创建开始至其终止退出的时间范围称为其生命周期。在这段时间中&#xff0c;Pod会处于多种不同的状态&#xff0c;并执行一些操作&#xff1b;其中&#xff0c;创建主容器&#xff08;main container&#xff09;为必需的操作&#xff0c;其他可选的操作还包…...

使用QAction编辑器添加QAction到ui里

在 Qt Designer 或 Qt Creator 的 UI 设计器 中&#xff0c;可以直接通过 Action Editor 可视化添加和管理 QAction&#xff0c;无需手动编写代码。以下是详细步骤&#xff1a; 步骤 1&#xff1a;打开 Action Editor 在 Qt Creator 中打开 .ui 文件&#xff08;双击项目中的…...

Unity:标签(tags)

为什么需要Tags&#xff1f; 在游戏开发中&#xff0c;游戏对象&#xff08;GameObject&#xff09;数量可能非常多&#xff0c;比如玩家、敌人、子弹等。开发者需要一种简单的方法来区分这些对象&#xff0c;并根据它们的类型执行不同的逻辑。 核心需求&#xff1a; 分类和管…...

深入解析 Python 正则表达式:全面指南与实战示例

深入解析 Python 正则表达式&#xff1a;全面指南与实战示例 &#x1f4cc; 引言 正则表达式&#xff08;Regular Expressions, regex&#xff09;是用于文本匹配、查找和替换的强大工具。在 Python 中&#xff0c;我们可以使用 re 模块来处理正则表达式。无论是数据清洗、日…...

Nginx介绍及使用

1.Nginx介绍 Nginx是一款开源的、高性能的HTTP和反向代理服务器 1.正向代理和反向代理 正向代理&#xff08;代理客户端&#xff09;是一种位于客户端和目标服务器之间的中间服务器。客户端通过正向代理服务器向目标服务器发送请求&#xff0c;代理服务器将请求转发给目标服…...

【Block总结】自适应矩形卷积,即插即用|CVPR2025

论文信息 标题: Adaptive Rectangular Convolution for Remote Sensing Pansharpening年份: 2025年会议: CVPR论文地址: arXiv代码地址: GitHub任务: 遥感图像融合&#xff08;Pansharpening&#xff09; 创新点 本论文提出了一种新颖的自适应矩形卷积模块&#xff08;ARCon…...

第2课:JSX语法与组件基础

第2课&#xff1a;JSX语法与组件基础 学习目标 深入理解JSX语法掌握组件的基本结构和用法学习使用Props传递数据掌握React中的样式添加方法创建任务卡片组件 一、JSX语法深入 1. 什么是JSX&#xff1f; JSX是JavaScript XML的缩写&#xff0c;它允许我们在JavaScript中编写…...

DevOps与Docker的关系

DevOps 与 Docker 是相辅相成的关系。DevOps 是一种强调开发&#xff08;Development&#xff09;与运维&#xff08;Operations&#xff09;之间协作的文化、实践和工具链&#xff0c;而 Docker 是一种容器化技术&#xff0c;为 DevOps 的实现提供了高效的技术支撑。 Docker …...

嵌入式AI简介

嵌入式AI是一种将人工智能算法部署在终端设备中运行的技术&#xff0c;使智能硬件能够在本地实时完成感知、交互和决策功能&#xff0c;无需依赖云端计算。以下是其核心要点&#xff1a; 一、核心特点 1. 本地化处理&#xff1a;数据在设备端直接处理&#xff0c;无需联网&a…...

多GPU训练

写在前面 限于财力不足&#xff0c;本机上只有一个 GPU 可供使用&#xff0c;因此这部分的代码只能够稍作了解&#xff0c;能够使用的 GPU 也只有一个。 多 GPU 的数据并行&#xff1a;有几张卡&#xff0c;对一个小批量数据&#xff0c;有几张卡就分成几块&#xff0c;每个 …...

JVM虚拟机篇(三):JVM运行时数据区与方法区详解

JVM虚拟机篇&#xff08;三&#xff09;&#xff1a;JVM运行时数据区与方法区详解 JVM虚拟机篇&#xff08;三&#xff09;&#xff1a;JVM运行时数据区与方法区详解一、引言二、JVM运行时数据区2.1 概述2.2 各部分的作用与交互2.2.1 堆与其他区域的关系2.2.2 方法区与其他区域…...

Rust学习日记:编写一个Python扩展

参考https://segmentfault.com/a/1190000044555330 命令行创建一个新的Rust项目cargo new --lib rust_python_ext 配置Cargo.toml [package] name "rust_python_ext" version "0.1.0" edition "2024"[lib] name "rust_python_ext"…...