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

单例模式(Singleton Pattern)

目录

1.什么是单例模式:

2.单例模式存在的原因:

3.单例模式的优缺点:

4.创建方式:

1. 单线程单例模式立即创建(饿汉式):

          2. 单线程单例模式延迟创建(懒汉式):

5.多线程下测试两种模式存在哪些问题

1.先测试饿汉式,代码如下:

2.测试懒汉式,修改 run 方法创建对象

6.两种模式简单对比:

7.其他的单例模式:


1.什么是单例模式:

单例模式(Singleton Pattern)是 Java 中最简单的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。

这种模式涉及到一个单一的类,该类负责创建自己的对象,同时确保只有单个对象被创建。这个类提供了一种访问其唯一的对象的方式,可以直接访问,不需要实例化该类的对象。

注意:

  • 1、单例类只能有一个实例。
  • 2、单例类必须自己创建自己的唯一实例。
  • 3、单例类必须给所有其他对象提供这一实例。

2.单例模式存在的原因:

一些对象的存在只需要唯一的一个,例如,缓存池和线程池。如果线程池存在多例的话,会导致资
源使用过量,缓存多个的话,会导致数据不一致

3.单例模式的优缺点:

优点:

  • 在内存中只有一个对象,节省内存空间
  • 避免频繁的创建销毁对象,可以提高性能
  • 避免对共享资源的多重占用,简化访问
  • 为整个系统提供一个全局访问点

缺点:

  • 没有接口,不能继承,
  • 与单一职责原则冲突,一个类应该只关心内部逻辑,而不关心外面怎么样来实例化

注意事项:getInstance() 方法中需要使用同步锁 synchronized (Singleton.class) 防止多线程同时进入造成 instance 被多次实例化。

4.创建方式:

创建一个 maven 项目 singleton

1. 单线程单例模式立即创建(饿汉式):

创建类cn.xs.singleton.Hunchback
public class Hunchback {/* 创建唯一一个单例对象 */private static Hunchback singleton = new Hunchback();/*** 不能让外界直接创建对象,所以设置私有构造器*/private Hunchback() {}/*** 单例对象的全局访问点** @return*/public static Hunchback getInstance() {return singleton;}
}

2. 单线程单例模式延迟创建(懒汉式):

在创建类 cn.xs.singleton.Lazybones
public class Lazybones {/* 创建唯一一个单例对象 */private static Lazybones singleton = null;/*** 不能让外界直接创建对象,所以设置私有构造器*/private Lazybones() {}/*** 单例对象的全局访问点** @return*/public static Lazybones getInstance() {if (singleton == null) {singleton = new Lazybones();}return singleton;}
}

5.多线程下测试两种模式存在哪些问题

新建测试类 cn.xs.singleton.SingletonTest

1.先测试饿汉式,代码如下:

public class SingletonTest extends Thread {@Overridepublic void run() {Hunchback singleton = Hunchback.getInstance();System.out.println(singleton);}/*** 测试方法** @param args*/public static void main(String[] args) {for (int i = 0; i < 10; i++) {SingletonTest singletonTest = new SingletonTest();singletonTest.start();}}
}
输出的都是同一个对象,没有线程安全问题,但是不能延迟加载

2.测试懒汉式,修改 run 方法创建对象

@Override
public void run() {Lazybones singleton = Lazybones.getInstance();System.out.println(singleton);
}
控制台输出了两个对象,可见,懒汉式存在线程安全问题
解决方式一:
在方法上加上 synchronized,保证对临界资源的同步互斥访问
/**
* 单例对象的全局访问点
*
* @return
*/
public synchronized static Lazybones getInstance() {if (singleton == null) {singleton = new Lazybones();}return singleton;
}
这种方式虽然解决了问题,但是当有线程在执行方法时,不管有没有创建对象,其他线程都会在外等候里面的线程执行完毕,有没有一种方式可以解决这个问题,提高代码执行效率
解决方式二:
在方法中创建对象部分设置同步块
public static Lazybones getInstance() {if (singleton == null) {synchronized (Lazybones.class) {if (singleton == null) {singleton = new Lazybones();}}}return singleton;
}
分析:当还没有创建对象的时候,如果被多个线程同时进入方法执行,比如线程 1,线程 2 进来执行方法,两个线程同时判断外层 if 时,都为 true ,都进入外层 if 执行,当走到同步块时,比如线程 1 进入同步块执行代码,线程 2 只能在外面等着,当线程 1 创建完对象执行完同步块后,线程 2 再进入同步块执行代码,在同步块中,线程 2 判断内层 if ,结果为 false ,不用再创建对象,再有别的线程来执行方法,就不会再一直等待前一个线程了,因为外层 if 已经永远为 false

6.两种模式简单对比:

饿汉式:线程安全,调用率高,但是不能延迟加载
懒汉式:线程安全,调用率不高,可以延迟加载

7.其他的单例模式:

双重检测锁式(由于JVM底层内部模型原因,偶尔会出问题,不建议使用)
静态内部类式(线程安全,调用效率高。但是,可以延时加载)
枚举式(线程安全,调用率高,不能延时加载)
对比五种模式,如何选用?
单例对象占用资源少,不需要延迟加载,枚举式比饿汉式好
单例对象占用资源大,需要延迟加载,静态内部类式比懒汉式好

相关文章:

单例模式(Singleton Pattern)

目录 1.什么是单例模式&#xff1a; 2.单例模式存在的原因&#xff1a; 3.单例模式的优缺点&#xff1a; 4.创建方式&#xff1a; 1. 单线程单例模式立即创建&#xff08;饿汉式&#xff09;&#xff1a; 2. 单线程单例模式延迟创建&#xff08;懒汉式&#xff09;&#xf…...

docker file和compose

文章目录1.dockerfile&#xff08;单机脚本&#xff09;1.概念2.原理3.dockerfile核心四步4.命令2.docker compose1.概念2.注意事项3.常用字段4.常用命令1.dockerfile&#xff08;单机脚本&#xff09; 1.概念 通过脚本&#xff0c;生成一个镜像&#xff0c;并运行对应的容器…...

如何解决thinkphp验证码不能显示问题?

thinkPHP做验证码这一块,可以使用自带的验证码扩展,具体步骤如下: 一、安装扩展 composer require topthink/think-captcha 二、模版中使用 将原来静态页面的验证码图片替换为{:captcha_img()},这个会自动生成验证码图片。 <div>{:captcha_img()}</div> 或者 &…...

Vue极简使用

Vue安装Vue模板语法安装Vue 安装nodejs 这里我安装的是14.5.4版本 https://nodejs.org/download/release/v14.15.4/解压后配置一下环境变量就行 安装cnpm镜像 (这个安装的版本可能过高&#xff0c;后面安装Vue可能出问题) npm install -g cnpm --registryhttps://registry…...

【Nacos】Nacos配置中心服务端源码分析

上文说了Nacos配置中心客户端的源码流程&#xff0c;这篇介绍下Nacos配置中心服务端的源码。 服务端的启动 先来看服务启动时干了啥&#xff1f; init()方法上面有PostConstruct&#xff0c;该方法会在ExternalDumpService实例化后执行。 com.alibaba.nacos.config.server.s…...

第十五章 栅格数据重分类、栅格计算器、插值分析

文章目录第十五章 栅格数据分析第一章 栅格数据重分类第一节 栅格数据重分类第二节 栅格重分类的使用第三节 重分类的使用中的空值使用第四节 重分类的案例&#xff1a;分类统计面积第五节 坡度矢量分级图生成第二章 栅格计算器第一节 栅格计算器介绍第二节 栅格计算器使用第三…...

CS5260测试版|CS5260demoboard|typec转VGA参考PCB原理图

CS5260测试版|CS5260demoboard|typec转VGA参考PCB原理图 CS5260是一款高度集成的TYPEC转VGA转换方案芯片。 CS5260输出端接口:外接高清VGA设备如:显示器投影机电视带高清的设备&#xff0c;广泛应用于 笔记本Macbook Air 12寸USB3.1输出端对外接高清VGA设备如:显示器投影机电视…...

winform开发心得

最近一直在从事winform的开发&#xff0c;每次都是需要从网上查找资料才能对应具体风格要求&#xff0c;现在总结一下。 ui方面可以使用CSkin对应的一套ui&#xff0c;使用步骤 1.在窗口界面&#xff0c;工具箱空白处点击右键&#xff0c;弹出菜单有个”选择项“&#xff0c;点…...

学习周报-2023-0210

文章目录一 在SUSE11sp3系统中将openssh从6升级到8一 需求二 系统环境三 部署流程1.上传编译安装的软件包2.安装 gcc编译软件3.安装依赖zlib4.安装依赖openssl5.安装openssh二 在CentOS-6.9配置apache服务&#xff08;3&#xff09;---虚拟主机配置一 定义二 系统环境三 基于域…...

百度富文本UE的问题集合

百度富文本编辑能上传视频成功但是在浏览器不能播放、显示的问题百度富文本视频封面空白问题百度富文本编辑器UMEditor 添加视频无法删除百度富文本编辑器结果存数据库取出来到js赋值报错怎么让浏览器重新加载修改过的JS文件&#xff0c;而不是沿用缓存里的百度富文本编辑能上传…...

在Linux上安装node-v14.17.3和npm-6.14.13

记录&#xff1a;374场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;安装node-v14.17.3-linux-x64环境。包括node-v14.17.3和npm-6.14.13。node命令应用和npm命令应用。版本&#xff1a;JDK 1.8 node v14.17.3 npm 6.14.13官网地址&#xff1a;https://nodejs.org/下载地址…...

机器学习框架sklearn之特征降维

目录特征降维概念特征选择过滤式①低方差特征过滤②相关系数③主成分分析特征降维 0维 标量 1维 向量 2维 矩阵 概念 降维是指在某些限定条件下&#xff0c;降低随机变量&#xff08;特征&#xff09;个数&#xff0c;得到一组“不相关”主变量的过程 注&#xff1a;正是…...

java实现二叉树(一文带你详细了解二叉树的)

&#x1f387;&#x1f387;&#x1f387;作者&#xff1a; 小鱼不会骑车 &#x1f386;&#x1f386;&#x1f386;专栏&#xff1a; 《数据结构》 &#x1f393;&#x1f393;&#x1f393;个人简介&#xff1a; 一名专科大一在读的小比特&#xff0c;努力学习编程是我唯一…...

学弟学妹少走弯路,超完整算法刷题路线出炉

大家好&#xff0c;我是帅地。 本篇文章主要讲解下面三个事&#xff1a; 1、自己学习算法的一些经历 2、大家学习算法存在的一些普遍问题 3、给大家规划的算法刷题路线 一、算法学习往事 记得当初学了 C 语言就开始刷题了&#xff0c;刷题倒不是面试&#xff0c;而是为了…...

Windows截取gif动态图的软件 ScreenToGif 的安装、使用教程

一、概述 &#x1f449;GIF&#xff08;Graphics Interchange Format&#xff09;&#xff0c;又称图形交换格式&#xff0c;是一种公用的图像文件格式标准&#xff0c;于1987年由Compu Serve公司成功研发并推出。 &#x1f449;GIF用于以超文本标志语言方式显示索引彩色图像&a…...

C++程序设计——多态:虚函数、抽象类、虚函数表

注&#xff1a;以下示例均是在VS2019环境下 一、多态的概念 通俗来讲&#xff0c;多态就是多种形态&#xff0c;当不同的对象去完成某个行为时&#xff0c;会产生出不同的状态。即不同继承关系的类对象&#xff0c;去调用同一函数时&#xff0c;产生不同的行为。 比如”叫“这…...

OpenMMLab AI实战营 第6课 语义分割与MMSegmentation

第6课 语义分割与MMSegmentation 1. 语义分割简介 任务&#xff1a;将图像按照物体的类别分割成不同的区域&#xff0c;等价于对每个像素进行分类应用 无人驾驶人像分割智能遥感医疗影像分析 语义分割 vs 实例分割 vs 全景分割 语义分割&#xff1a;仅考虑像素的类别&#xf…...

产业互联网是对互联网的衍生和进化,也是一次重塑和再造

互联网并不仅仅只是充当撮合和中介的角色&#xff0c;它应当具备更多的功能和意义。只有这样&#xff0c;它的发展才能够真正全面和完善。产业互联网的衍生和出现&#xff0c;正是在互联网进化的基础之上出现的。这是我们看到之所以会有那么多的互联网玩家投身到产业互联网的浪…...

Shell脚本之——Hadoop3单机版安装

目录 1.解压 2.文件重命名 3.配置环境变量 4.hadoop-env.sh 5.core-site.xml 6. hdfs-site.xml 7. mapred-site.xml 8.yarn-site.xml 9.完整脚本代码(注意修改主机名) 10.重启环境变量 11.初始化 12.启动服务 13.jps查询节点 1.解压 tar -zxf /opt/install/hadoo…...

代码随想录NO39 |0-1背包问题理论基础 416.分割等和子集

0-1背包问题理论基础 分割等和子集1. 0-1背包问题理论基础(二维数组实现)2. 0-1背包问题理论基础 二&#xff08;一维数组实现&#xff09;1. 0-1背包问题理论基础(二维数组实现) 背包问题一般分为这几种&#xff1a; 0-1背包问题&#xff1a;有n件物品和一个最多能背重量为w…...

FITC-PEG-FA,荧光素-聚乙二醇-叶酸,FA-PEG-FITC,实验室科研试剂,提供质量检测

FITC-PEG-FA&#xff0c;荧光素-聚乙二醇-叶酸 中文名称&#xff1a;荧光素-聚乙二醇-叶酸 英文名称&#xff1a;FITC-PEG-FA 英文别名&#xff1a;Fluorescein-PEG-Folic Acid 性状&#xff1a;基于不同的分子量&#xff0c;呈白色/类白色固体&#xff0c;或粘稠液体。 溶…...

简洁易懂:源码+实战讲解Redisson并发锁及看门狗自动续期

1 缘起 有一次同事问Redisson存储的键是否为hash&#xff1f; 我当时&#xff0c;没有看Redisson的相关源码&#xff0c;只知道应用&#xff0c; 所以没有办法回答&#xff0c;于是开始看看Redisson实现的源码&#xff0c; 顺便写了一个单机Redisson测试&#xff0c; 发现Redi…...

TCP 三次握手和四次挥手

✏️作者&#xff1a;银河罐头 &#x1f4cb;系列专栏&#xff1a;JavaEE &#x1f332;“种一棵树最好的时间是十年前&#xff0c;其次是现在” 目录TCP 建立连接(三次握手)为啥不能是 4 次&#xff1f;为啥不能是 2 次&#xff1f;三次握手的意义&#xff1a;TCP 断开连接(四…...

JavaWeb复习

JavaWeb复习一.概述1.概念2.B/S和C/S 架构二.HTTP通信协议概述1.概念2.HTTP1.0 与 HTTP1.1 版本3.HTTP 协议组成4.常见状态码5.GET 与 POST 请求方式三.Tomcat1.Web服务器介绍2.安装&#xff08;Windows&#xff09;3.Tomcat目录结构4.server.xml部分配置解释四.Servlet1.概念2…...

P14 PyTorch AutoGrad

前言&#xff1a;激活函数与loss的梯度PyTorch 提供了Auto Grad 功能&#xff0c;这里系统讲解一下torch.autograd.grad系统的工作原理&#xff0c;了解graph 结构目录&#xff1a;1: require_grad False2: require_grad True3&#xff1a; 多层bakcward 原理4&#xff1a; in…...

前端报表如何实现无预览打印解决方案或静默打印

在前端开发中&#xff0c;除了将数据呈现后&#xff0c;我们往往需要为用户提供&#xff0c;打印&#xff0c;导出等能力&#xff0c;导出是为了存档或是二次分析&#xff0c;而打印则因为很多单据需要打印出来作为主要的单据来进行下一环节的票据支撑&#xff0c; 而前端打印可…...

Operating System Course 2 - My OS

Computer Startup process上一篇&#xff1a;http://t.csdn.cn/XfUKt 讲到这个启动设备的第一个扇区&#xff1a;引导扇区。那么引导扇区的代码长什么样子&#xff1f;这里得看引导扇区代码源文件bootsect.s&#xff08;.s后缀文件为用汇编语言编写的源代码文件&#xff09;。另…...

离散数学 课时一 命题逻辑的基本概念

1 命题 1、命题&#xff1a;可以判断其真值的陈述句 2、真值&#xff1a;真或者假(1或者0) 3、真命题&#xff1a;真值为真的命题 4、假命题&#xff1a;真值为假的命题 5、原子命题&#xff1a;不可以再被分解成更简单的命题 6、复合命题&#xff1a;由原子命题通过联结词联结…...

Word文档带有权限密码怎么办?

Word文档的权限密码指的是什么&#xff1f;其实这是Word文档的保护方法之一&#xff0c;具体指Word文档的编辑、修改受到了限制&#xff0c;需要输入密码才能进行。 设置了权限密码的Word文档还是可以直接打开&#xff0c;只有当需要编辑或者修改内容的时候&#xff0c;才会发…...

C++多态

1. 多态的概念1.1 概念多态的概念&#xff1a;通俗来说&#xff0c;就是多种形态&#xff0c;具体点就是去完成某个行为&#xff0c;当不同的对象去完成时会产生出不同的状态举个例子&#xff1a;比如买票这个行为&#xff0c;当普通人买票时&#xff0c;是全价买票&#xff1b…...

网站设计的基本步骤和方法/广州网站优化

在我们登录一些网站、应用、游戏时&#xff0c;见到动态验证码的频率越来越多了。最常见的应该就是Google Authenticator&#xff0c;暴雪安全令之类的应用&#xff0c;通过不断变换的动态数字来最大限度的保证账号的数据安全。今天 Gitee 推荐的这款开源项目&#xff0c;是依托…...

企业建设网站的好处/国内10大搜索引擎

盼望着&#xff0c;盼望着。在其他省市的小伙伴早已开奖&#xff0c;奖金都快花完了的时候。北京的同学们&#xff0c;终于可以开奖退税了。点开之前&#xff0c;谁也不知道是喜是忧&#xff1b;点开之后&#xff0c;有人欢喜有人愁。拿出早已收藏好的办税攻略&#xff0c;把看…...

网站建设费属于无形资产吗/汕头百度网站排名

基本功能已经实现&#xff0c;可以运行随机数的生成以及随机运算符的生成。但是还不能控制题的难度和题结果的对错。 编写的过程中遇到的问题有随机数的生成&#xff0c;但后来已通过查找资料解决。转载于:https://www.cnblogs.com/kasumis/p/7612044.html...

怎么查寻一个网站做的竞价/国内新闻大事20条

ssh key有问题&#xff0c;连接不上服务器 git clone的时候遇到的这个问题&#xff0c;原来是我本地没有设置好ssh 1、首先我得重新在git设置一下身份的名字和邮箱 git config --global user.name “yourname” git config --global user.email“youremail.com" 注&am…...

河南商丘疫情最新政策/seo是什么意思 为什么要做seo

Symantec Endpoint Protection v11.0.5002.333 简体中文企业版 【现象描述】&#xff1a;为了内网安全&#xff0c;内网可以上外网的一台服务器上面部署了网络版symantec杀毒软件&#xff0c;版本是 v11.0.5002.333 简体中文企业版&#xff1b;由它生成的客户端&#xff0c;分发…...

网站左边logo图标怎么做/苏州网站维护

一、jQuery概述 宗旨: Write Less, Do More. 基础知识&#xff1a; 1.符号$代替document.getElementById()函数 2.使用CssXpath来查询页面元素 3.适当的混用jQuery、Dom和JavaScript能够提升程序的执行效率。 如&#xff1a;Offset、App…...