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

设计模式 -- 单例设计模式

1.1 单例

创建一个单例对象 SingleModel , SingleModel 类有它的私有构造函数和本身的一个静态实例。
SingleModel 类提供了一个静态方法,供外界获取它的静态实例。 DesignTest 我们的演示类使用
SingleModel 类来获取 SingleModel 对象。
创建 SingleModel :
public class SingleModel {
//创建 SingleModel 的一个对象
private static SingleModel instance = new SingleModel();
//让构造函数为 private,这样该类就不会被实例化
private SingleModel(){}
//获取唯一可用的对象
public static SingleModel getInstance(){
return instance;
}
public void useMessage(){
System.out.println("Single Model!");
}
}
测试:
public class DemoTest {
/****
* 单例模式测试
*/
@Test
public void testSingleModel(){
//不合法的构造函数
//编译时错误:构造函数 SingleModel() 是不可见的
//SingleModel singleModel = new SingleModel();
//获取唯一可用的对象
SingleModel singleModel1 = SingleModel.getInstance();
SingleModel singleModel2 = SingleModel.getInstance();
//显示消息
singleModel1.useMessage();
//创建的2个对象是同一个对象
System.out.println(singleModel1 == singleModel2);
}
}
输入结果如下:
Single Model!
true
我们测试创建 10 万个对象,用单例模式创建,仅占内存: 104 字节,而如果用传统方式创建 10 万个对
象,占内存大小为 2826904 字节。

1.2 扩展

单例模式有多种创建方式,刚才创建方式没有特别的问题,但是程序启动就需要创建对象,不管你用不
用到对象,都会创建对象,都会消耗一定内存。因此在单例的创建上出现了多种方式。
懒汉式:
1 、延迟加载创建,也就是用到对象的时候,才会创建
2 、线程安全问题需要手动处理 ( 不添加同步方法,线程不安全,添加了同步方法,效率低 )
3 、实现容易
案例如下: SingleModel1
 public class SingleModel1 {private static SingleModel1 instance;private SingleModel1(){}public static SingleModel1 getInstance(){if(instance == null){instance = new SingleModel1();}return instance;}}
如果在创建对象实例的方法上添加同步 synchronized , 但是每次 get 获取对象都必须排队竞争,效率极
低,代码如下:
添加同步会解决多线程安全的问题但是会明显的降低获取对象实例的效率。
public static synchronized SingleModel1 getInstance() {if (instance == null){instance = new SingleModel1();}return instance;}
双重校验锁: SingleModel2
这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
public class SingleModel2 {//不实例化private static SingleModel2 instance;//让构造函数为 private,这样该类就不会被实例化private SingleModel2(){}//获取唯一可用的对象public static SingleModel2 getInstance(){
//instance为空的时候才创建对象if(instance==null){
//同步锁,效率比懒汉式高synchronized (SingleModel2.class){
//这里需要判断第2次为空if(instance==null){instance = new SingleModel2();}}}return instance;}public void useMessage(){System.out.println("Single Model!");}}
指令重排问题
对象创建,一般正确流程如下:
  1. 申请内存空间
  2. 创建并初始化对象
  3. 将变量指向申请的内存空间地址
但其实在对象创建的时候,也有可能发生 指令重排问题,也就是上面流程会被打乱:
  1. 申请内存空间
  2. 将变量指向申请的内存空间地址 //这一步后,变量不再为null,但是初始化其实并没完成
  3. 创建并初始化对象
如果是这样的话,双检锁在多线程情况下也会出现问题,需要添加 volatile 属性,该属性能防止指令
重排,代码如下:
    public class SingleModel2 {//不实例化private static volatile SingleModel2 instance;//让构造函数为 private,这样该类就不会被实例化private SingleModel2(){}//获取唯一可用的对象public static SingleModel2 getInstance(){
//instance为空的时候才创建对象if(instance==null){
//同步锁,效率比懒汉式高synchronized (SingleModel2.class){
//这里需要判断第2次为空if(instance==null){instance = new SingleModel2();}}}return instance;}public void useMessage(){System.out.println("Single Model!");}}

1.3 单例模式特点

  1. 单例类只能有一个实例。 A a = new A()
  2. 单例类必须自己创建自己的唯一实例。
  3. 单例类必须给所有其他对象提供这一实例。

1.4单例模式优点:

  1. 在内存里只有一个实例,减少了内存的开销,尤其是频繁的创建和销毁实例。
  2. 避免对资源的多重占用(比如写文件操作)。

相关文章:

设计模式 -- 单例设计模式

1.1 单例 创建一个单例对象 SingleModel , SingleModel 类有它的私有构造函数和本身的一个静态实例。 SingleModel 类提供了一个静态方法,供外界获取它的静态实例。 DesignTest 我们的演示类使用 SingleModel 类来获取 SingleModel 对象。 创建 Single…...

python fastapi 打包exe

创建虚拟环境 python -m venv 国内依赖仓库 # 换源 pip config set global.index-url https://pypi.tuna.tsinghua.edu.cn/simple pip config set install.trusted-host mirrors.aliyun.com 安装nuitka pip install nuitka 生成exe nuitka --mingw64 --show-progress --s…...

【测试开岗面试】知识点总结

1.知识点总结 Q:请你分别介绍一下单元测试、集成测试、系统测试、验收测试、回归测试 单元测试 (Unit Testing) 单元测试是对软件中最小可测试单元(通常是函数或方法)进行验证的过程。它的目的是确保每个单元在设计时的功能能够正常运行。单元测试通常由…...

【高级编程】synchronized 解决并发问题 类的线程安全类型

文章目录 并发问题同步方法同步代码块 线程安全类型ArrayListHashtableHashMapVector 多线程共享数据引发的问题 模拟 “A” “B” “C” 三人抢票,总票数10张,打印抢票情况以及剩余票数。 public class Site implements Runnable {int count 10; // …...

Speculative RAG:为知识密集型数据服务的RAG

论文链接 RAG的一个棘手问题是不知道该召回多少chunk,少了可能丢信息,多了会引入噪声信息。虽然有self-reasoning等自我反思的解决办法,但是整体链路太长,延迟高,不利于工业落地。 虽然无法面对整个服务场景&#xff…...

[Go]-抢购类业务方案

文章目录 要点:1. 抢购/秒杀业务的关键挑战2. 技术方案3.关键实现点4.性能优化建议5.其他考虑因素 细节拆分:1. **高并发处理**2.**限流与防护**3.**库存控制**4. **异步处理**5. **数据一致性**6. **常用架构设计**7. **代码示例**8. 进一步优化9. 注意…...

Android 源码多个Launcher设置默认Launcher

目录 第一部分、android10之前 一.多个launcher 启动设置默认launcher的核心类 二 在自定义服务里面设置默认Launcher 第二部分、android10之后 一、Launcher应用内置并设置为默认Launcher 1.通过ResolverActivity.java设置为默认Launcher 改法一: 改法二&am…...

计算机毕业设计 网上体育商城系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点…...

深度学习中实验、观察与思考的方法与技巧

在深度学习中,实验、观察与思考是理解和改进模型性能的关键环节。以下是一些有效的方法与技巧,可以帮助你在深度学习实践中系统性地开展实验、分析结果并进行深入思考: 1. 明确实验目标 在开始实验前,确保对实验的目标有清晰的定…...

记一次 FastDFS 存储节点迁移:基于 scp 的实践与经验分享

一、背景 某某项目,机房到期,需要迁移至其他机房; 此项目已经运行了3年多,fastdfs累计数据大概在250G 左右,现需要把旧的fastdfs数据迁移到新的fastdfs上; 采用scp物理迁移数据的方式,停机迁移…...

http连接github远程仓库密码问题解决办法

目录 一、问题:使用http连接失败 二、解决办法:使用个人访问令牌。 1、生成访问令牌: 步骤 1: 登录 GitHub 步骤 2: 进入设置页面 步骤 3: 生成新的访问令牌 步骤 4: 配置访问令牌 步骤 5: 复制令牌 2. 使用访问令牌 一、问题&#…...

LAMP环境下项目部署

目录 目录 1、创建一台虚拟机 centos 源的配置 备份源 修改源 重新加载缓存 安装软件 2、关闭防火墙和selinux 查看防火墙状态 关闭防火墙 查看SELinux的状态 临时关闭SELinux 永久关闭SELinux:编辑SELinux的配置文件 配置文件的修改内容 3、检查系统…...

Visual Studio 2022从外部引入dll导致的问题

这里以我学MapGIS二次开发的一个小demo为例 一、如何引入dll 1、在解决方案资源管理器中,有个引用的选项 2、然后右键点击添加引用 点击之后会出现如下: 3、点击浏览选项,选择想要引入dll的路径,这里我选择下载MapGIS 10的路径 …...

大模型从失败中学习 —— 微调大模型以提升Agent性能

人工智能咨询培训老师叶梓 转载标明出处 以往的研究在微调LLMs作为Agent时,通常只使用成功的交互轨迹,而丢弃了未完成任务的轨迹。这不仅造成了数据和资源的浪费,也可能限制了微调过程中可能的优化路径。论文《Learning From Failure: Integ…...

10.web应用体系以及windows网络常见操作应用

一、Dos命令 1.启动方式:winR,输入cmd 2.切换盘符/路径:盘符名称: (C:) cd 目录 (cd B111)(目录名按table键自动补全) 3.查看目录:dir dir /p 分页展示目录及…...

【数据结构与算法 | 灵神题单 | 前后指针(链表)篇】力扣19, 61,1721

1. 力扣19:删除链表的倒数第N个节点 1.1 题目: 给你一个链表,删除链表的倒数第 n 个结点,并且返回链表的头结点。 示例 1: 输入:head [1,2,3,4,5], n 2 输出:[1,2,3,5]示例 2: …...

机器学习之实战篇——MNIST手写数字0~9识别(全连接神经网络模型)

机器学习之实战篇——Mnist手写数字0~9识别(全连接神经网络模型) 文章传送MNIST数据集介绍:实验过程实验环境导入模块导入MNIST数据集创建神经网络模型进行训练,测试,评估模型优化 文章传送 机器学习之监督学习&#…...

ICLR2024: 大视觉语言模型中对象幻觉的分析和缓解

https://arxiv.org/pdf/2310.00754 https://github.com/YiyangZhou/LURE 背景 对象幻觉:生成包含图像中实际不存在的对象的描述 早期的工作试图通过跨不同模式执行细粒度对齐(Biten et al.,2022)或通过数据增强减少对象共现模…...

数据库系统 第54节 数据库优化器

数据库优化器是数据库管理系统(DBMS)中的一个关键组件,它的作用是分析用户的查询请求,并生成一个高效的执行计划。这个执行计划定义了如何访问数据和执行操作,以最小化查询的执行时间和资源消耗。以下是数据库优化器的…...

微服务杂谈

几个概念 还是第一次听说Spring Cloud Alibaba ,真是孤陋寡闻了,以前只知道 SpringCloud 是为了搭建微服务的,spring boot 则是快速创建一个项目,也可以是一个微服务 。那么SpringCloud 和 Spring boot 有什么区别呢?S…...

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...

渗透实战PortSwigger靶场-XSS Lab 14:大多数标签和属性被阻止

<script>标签被拦截 我们需要把全部可用的 tag 和 event 进行暴力破解 XSS cheat sheet&#xff1a; https://portswigger.net/web-security/cross-site-scripting/cheat-sheet 通过爆破发现body可以用 再把全部 events 放进去爆破 这些 event 全部可用 <body onres…...

工程地质软件市场:发展现状、趋势与策略建议

一、引言 在工程建设领域&#xff0c;准确把握地质条件是确保项目顺利推进和安全运营的关键。工程地质软件作为处理、分析、模拟和展示工程地质数据的重要工具&#xff0c;正发挥着日益重要的作用。它凭借强大的数据处理能力、三维建模功能、空间分析工具和可视化展示手段&…...

python如何将word的doc另存为docx

将 DOCX 文件另存为 DOCX 格式&#xff08;Python 实现&#xff09; 在 Python 中&#xff0c;你可以使用 python-docx 库来操作 Word 文档。不过需要注意的是&#xff0c;.doc 是旧的 Word 格式&#xff0c;而 .docx 是新的基于 XML 的格式。python-docx 只能处理 .docx 格式…...

DeepSeek 技术赋能无人农场协同作业:用 AI 重构农田管理 “神经网”

目录 一、引言二、DeepSeek 技术大揭秘2.1 核心架构解析2.2 关键技术剖析 三、智能农业无人农场协同作业现状3.1 发展现状概述3.2 协同作业模式介绍 四、DeepSeek 的 “农场奇妙游”4.1 数据处理与分析4.2 作物生长监测与预测4.3 病虫害防治4.4 农机协同作业调度 五、实际案例大…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...

重启Eureka集群中的节点,对已经注册的服务有什么影响

先看答案&#xff0c;如果正确地操作&#xff0c;重启Eureka集群中的节点&#xff0c;对已经注册的服务影响非常小&#xff0c;甚至可以做到无感知。 但如果操作不当&#xff0c;可能会引发短暂的服务发现问题。 下面我们从Eureka的核心工作原理来详细分析这个问题。 Eureka的…...

Xen Server服务器释放磁盘空间

disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

管理学院权限管理系统开发总结

文章目录 &#x1f393; 管理学院权限管理系统开发总结 - 现代化Web应用实践之路&#x1f4dd; 项目概述&#x1f3d7;️ 技术架构设计后端技术栈前端技术栈 &#x1f4a1; 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 &#x1f5c4;️ 数据库设…...

LLMs 系列实操科普(1)

写在前面&#xff1a; 本期内容我们继续 Andrej Karpathy 的《How I use LLMs》讲座内容&#xff0c;原视频时长 ~130 分钟&#xff0c;以实操演示主流的一些 LLMs 的使用&#xff0c;由于涉及到实操&#xff0c;实际上并不适合以文字整理&#xff0c;但还是决定尽量整理一份笔…...