【设计模式】之单例模式

embedded/2024/9/18 12:53:24/ 标签: 设计模式, java, 单例模式

系列文章目录


文章目录

系列文章目录

前言

一、什么是单例模式

二、如何使用单例模式

1.单线程使用

2.多线程使用(一)

3.多线程使用(二)

4.多线程使用(三)双重检测

总结


前言

今天给大家介绍23种设计模式中的单例模式,也是大家比较常见的一种设计模式,但是,里面的一些细节还是有很多人会忽略的。🌈


一、什么是单例模式

单例模式指在内存中只会创建且仅创建一次对象的设计模式。在程序中多次使用同一个对象且作用相同时,为了防止频繁地创建对象使得内存飙升,单例模式可以让程序仅在内存中创建一个对象,让所有需要调用的地方都共享这一单例对象。

二、如何使用单例模式

1.单线程使用

这种方式只适合单线程下使用,多线程下会实例化多个对象,不一定是10个。

java">public class Single {private static Single instance;private Single(){System.out.println("实例化Single对象");}public static Single getInstance(){if (instance == null) instance = new Single();return instance;}
}

测试:

java">public class test {public static void main(String[] args) {for (int i = 0; i < 10; i++) {Single.getInstance();}}
}
测试结果:/*实例化Single对象Process finished with exit code 0*/

2.多线程使用(一)

只需添加一个synchronized 关键字即可

java">public class Single {private static Single instance;private Single(){System.out.println("实例化Single对象");}public synchronized static Single getInstance(){if (instance == null) instance = new Single();return instance;}
}

测试:

java">public class test {public static void main(String[] args) {for (int i = 0; i < 10; i++) {new Thread(()->{Single.getInstance();}).start();}}
}
测试结果:/*实例化Single对象Process finished with exit code 0*/
虽然添加 synchronized 可以在多线程下保证实例化一次对象,但是因为加锁,会造成系统资源浪费。假设我们遍历10次,相当经过多次经过锁,而我们只需要保证第一次实例化成功,也就是加一次锁,后面的会经过逻辑判断,不会实例化对象。因此,我们引出了下面一种方法。

3.多线程使用(二)

在类加载的时候直接实例化对象。

java">public class Single {private static Single instance = new Single();private Single(){System.out.println("实例化Single对象");}public  static Single getInstance(){return instance;}
}

测试结果跟上方一样

4.多线程使用(三)双重检测

这种方式也能大大减少锁带来的性能消耗。

java">public class Single {private volatile static Single instance ;private Single(){System.out.println("实例化Single对象");}public static Single getInstance(){if (instance == null){synchronized (Single.class){if (instance == null){instance = new Single();}}}return instance;}
}

总结

以上就是单例模式在单多线程下的使用以及优化,今天就先介绍到这里,我们下期再见。✋


http://www.ppmy.cn/embedded/28881.html

相关文章

AutoMQ 系统测试体系揭秘

01 前言 Apache Kafka 有着比较完备的自测体系。除了常规的单元测试和集成测试以外&#xff0c;Apache Kafka 还有着 1000 的“系统集成和性能测试”&#xff08;以下简称系统测试&#xff09;。系统测试会拉起一套真实的 Kafka 集群&#xff0c;并模拟用户使用 Kafka 集群的方…

pyqt 按钮常用格式Qss设置

pyqt 按钮常用格式Qss设置 QSS介绍按钮常用的QSS设置效果代码 QSS介绍 Qt Style Sheets (QSS) 是 Qt 框架中用于定制应用程序界面样式的一种语言。它类似于网页开发中的 CSS&#xff08;Cascading Style Sheets&#xff09;&#xff0c;但专门为 Qt 应用程序设计。使用 QSS&am…

8、Flink 在 source 处生成水位线 和 在 source 之后生成水位线案例

1、AtSourceGenerateWatermark 注意&#xff1a;从 Flink 1.17开始&#xff0c;FLIP-27 源框架支持拆分级别的水印对齐。 import java.time.Duration;public class _02_AtSourceGenerateWatermark {public static void main(String[] args) throws Exception {StreamExecution…

Redis运维篇-快速面试笔记(速成版)

文章目录 1. Redis的持久化1.1 RDB&#xff08;快照模式&#xff09;1.2 AOF 模式 2. Redis主从模型&#xff08;高可用&#xff09;2.1 Redis的主从复制2.2 Redis拓扑结构 3. Redis集群模式&#xff08;高并发&#xff09;3.1 Redis的Slots3.2 集群模式的常用命令3.3 多主多从…

CentOS安装Docker指南

Docker安装与配置教程 Docker作为一种轻量级的虚拟化技术&#xff0c;在现代软件开发和运维中扮演着重要的角色。下面&#xff0c;我将以技术博主的身份&#xff0c;向大家详细介绍如何在Linux系统上安装和配置Docker&#xff0c;特别是如何设置Docker的监听地址和端口&#x…

装饰器模式、代理模式、适配器模式对比

装饰器模式、代理模式和适配器模式都是结构型设计模式&#xff0c;它们的主要目标都是将将类或对象按某种布局组成更大的结构&#xff0c;使得程序结构更加清晰。这里将装饰器模式、代理模式和适配器模式进行比较&#xff0c;主要是因为三个设计模式的类图结构相似度较高、且功…

QT5之lambda+内存回收机制

使用lambda需要 配置c11 所以在点.pro文件里面配置添加如下 CONFIG c11 使用到qDebug 打印包含头文件 #include<QDebug> lambda 表达式使用 代替槽如下 #include "mainwidget.h" #include<QPushButton> #include<QDebug> mainWidget::mainWid…

嵌入式-进程、线程

一、fork 实例1 使用fork()系统调用来创建一个新的进程&#xff08;子进程&#xff09; #include <stdio.h> #include <sys/types.h> #include <unistd.h> #include <stdlib.h> // 添加了stdlib.h头文件&#xff0c;用于exit()函数 int main…

2024-05-01 区块链-比特币-相关文档

摘要: 2024-05-01 区块链-比特币-文档-记录 比特币: https://github.com/bitcoin/bitcoin https://bitcoincore.org/ https://bitcoin.org/ https://github.com/bitcoin-dot-org/developer.bitcoin.org https://developer.bitcoin.org/ 简介 《Bitcoin Developer Guide》中文…

[技术总结]: Pytorch加速和省内存

目录 mmengine 相关文档pytorch ddp dataset使用共享内存加速数据读取一些大规模数据集加载模型多卡训练, 模型并行 mmengine 相关文档 MMEngine理解 pytorch ddp dataset使用共享内存 关键在于将data_list序列化 mmengine实现 或者使用lmdb数据库也可以 加速数据读取 使…

[Linux][网络][HTTP协议][Cookie][Session]详细讲解

目录 0.HTTP简介1.认识URL2.urlencode和urldecode3.HTTP协议格式1.HTTP报文2.HTTP协议请求格式3.HTTP响应协议格式 4.HTTP的方法1.表单2.GET vs POST 5.HTTP状态码1.3XX -- 重定向状态码 6.HTTP常见Header7.Cookie0.情景铺垫1.cookie的登陆策略2.cookie的风险3.注意点 8.Sessio…

Java高阶私房菜:JVM分代收集算法介绍和各垃圾收集器原理分解

目录 什么是分代收集算法 GC的分类和专业术语 什么是垃圾收集器 垃圾收集器的分类及组合 ​编辑 应关注的核心指标 Serial和ParNew收集器原理 Serial收集器 ParNew收集器 Parallel和CMS收集器原理 Parallel 收集器 CMS收集器 新一代垃圾收集器G1和ZGC G1垃圾收集器…

3d数字化在线云展平台打破传统束缚

在数字化浪潮的推动下&#xff0c;线上VR云展会正以其独特的魅力&#xff0c;为展览主办方打开一扇全新的大门。这一新兴展览形式不仅突破了传统实体展览的时间、空间和物理限制&#xff0c;更为国际性展览活动带来了前所未有的可能性。 作为展览主办方&#xff0c;您是否曾为实…

clickhouse安装部署

虚拟机&#xff1a;virtualbox7.0 操作系统&#xff1a;ubuntu server 22.04.3 虚拟机硬件&#xff1a;cpu 1&#xff0c;内存 2G&#xff0c; 硬盘 100G 采用默认安装 参照 https://clickhouse.com/docs/en/install#quick-install 安装部署 对于Debian、Ubuntu&#xff0c…

在单细胞分辨率下预测细胞对新型药物扰动的反应

scRNA-seq能够在单个细胞分辨率下研究细胞异质性对扰动的响应。然而&#xff0c;由于技术限制&#xff0c;扩大高通量筛选&#xff08;HTSs&#xff0c;highthroughput screens&#xff09;来测量许多药物的细胞反应仍然是一个挑战。因此&#xff0c;目前依然需要借助常规的bul…

IDEA连接数据库

先在本地安装mysql connector net 安装navicat&#xff0c;连接mysql&#xff0c;并对mysql中的内容进行修改和查看&#xff0c;如新建数据库&#xff0c;新建表等 社区版的idea界面中找不到database选项&#xff0c;需要先在setting中的plugin中安装database navicate&#…

4-b12(汉诺塔),要求给出移动过程中每根柱子上现有的圆盘数量及编号

【要求&#xff1a;】 1、假设圆盘最大数量为10&#xff0c;其余输入格式要求同前 2、要求打印初始状态下&#xff0c;起始圆柱拥有的圆盘数及每个圆盘的编号&#xff0c;在随后的每个移动步骤中&#xff0c;打印移动完成后每个圆柱的现有的圆盘数及编号&#xff08;效果如下…

笔试狂刷--Day10(回文子串+贪心+dp)

大家好,我是LvZi,今天带来笔试狂刷--Day10 一.最⻓回⽂⼦串 题目链接:最⻓回⽂⼦串 分析: 中心拓展算法 代码: public class Solution {/*** 代码中的类名、方法名、参数名已经指定&#xff0c;请勿修改&#xff0c;直接返回方法规定的值即可*** param A string字符串* ret…

每日一题-贪心算法

目录 前言 买入股票的最佳时机(1) 买入股票的最好时机(2) 前言 当你踏上贪心算法的旅程&#xff0c;仿佛置身于一场智慧的盛宴&#xff0c;每一步都是对问题解决方案的审慎选择&#xff0c;每一次决策都是对最优解的向往。贪心算法以其简洁高效的特性&#xff0c;被广泛运用于…

从流形的观点分析神经网络

从流形的观点分析神经网络 无意中看到一本用数学分析神经网络的书&#xff0c;里面用各种数学工具来分析神经网络&#xff08;如数学分析、线性代数、流形、信息论、概率论、优化等&#xff09;&#xff0c;书的信息如下&#xff1a; Ovidiu Calin, Deep Learning Architecture…