Java设计模式-创建型模式-单例模式
单例模式
- 单例模式
- 饿汉式
- 懒汉式
单例模式
解释:一个类只能有一个实例
单例模式可以分为两种 饿汉式 和 懒汉式
饿汉式
也被称为预加载,即 在加载类的时候,就将实例创建出来,加载到内存,不管之后会不会使用这个实例
主打一个饥不择食,体现了贪心的思想。
public class HungrySingleton {//方式1:静态变量private static HungrySingleton instance = new HungrySingleton();//方式2:静态代码块/*static {instance = new HungrySingleton();}*///方式3:枚举,可以看 EnumSingleton.classpublic static HungrySingleton getInstance(){return instance;}
}
很明显,我们还没有使用该对象,就已经加载到了内存,浪费内存
但是,同时,因为只有一此创建对象,所以饿汉式是线程安全的
懒汉式
也成为懒加载,即:只有在使用该类时才创建需要的对象。
我很懒,你不用我,我就不创建对象
一般有四种实现方式
- 简单懒汉式,不能用,线程不安全
- Synchronized 同步方法,一般不用,线程安全,但锁粒度太大,效率较低
- 双重检查锁,可以用,注意使用volatile 关键字保证单例对象的原子性
- 静态内部类,推荐使用
public class LazySingleton {private volatile static LazySingleton instance;/*** 简单懒汉式* 问题:线程不安全,一般不用* @return*/public static LazySingleton getInstance01() {if(null == instance){instance = new LazySingleton();}return instance;}/*** synchronized* 解决了线程安全问题,但效率低,一般不用* @return*/public synchronized static LazySingleton getInstance02() {if(null == instance){instance = new LazySingleton();}return instance;}/*** 双重检查锁模式* 降低锁的粒度,只锁创建对象的代码块* 需要增加 volatile 来保证原子性,防止jvm指令重排,但同时屏蔽了JVM的一些代码优化* @return*/public static LazySingleton getInstance03() {if(null == instance){synchronized (LazySingleton.class){if(null == instance){//防止重复创建对象instance = new LazySingleton();}}}return instance;}/*** 静态内部类方式* 只有在使用时才会创建静态内部类,推荐使用* @return*/public static LazySingleton getInstance04() {return SingletonHolder.INSTANCE;}private static class SingletonHolder{private static final LazySingleton INSTANCE = new LazySingleton();}
}
这里解释下 为什么 双重检查锁要 使用 volatile 关键字 修饰单例对象
if判断以及其内存执行代码是非原子性的。其次,new LazySingleton()无法保证执行的顺序性。
显然,不满足原子性或者顺序性,线程肯定是不安全的。
下面主要讲一下 new LazySingleton() 为什么不能保证顺序性。
设想一下,创建一个对象,应该分为几步?
答案是三步,如下:
memory=allocate();//1:初始化内存空间
ctorInstance(memory);//2:初始化对象
instance=memory();//3:设置instance指向刚分配的内存地址
jvm为了提高程序执行性能,会对没有依赖关系的代码进行重排序,也就是说上面2和3行代码可能被重新排序。
我用两个线程举例:
| 时间片 | 线程A | 线程B |
|---|---|---|
| t1 | 初始化内存空间 | |
| t2 | 设置instance指向刚分配的内存地址 | |
| t3 | 判断instance 是否为空 | |
| t4 | 由于instanc不为空,获取到一个空的实例化对象(线程不安全) | |
| t5 | 初始化对象 |
volatile 关键字就是强制要求jvm 不进行指令重排,按顺序执行,当然也有一定的性能损失
volatile 其他相关知识 可以参考以下文章:
https://blog.csdn.net/m0_50370837/article/details/124380385
相关文章:
Java设计模式-创建型模式-单例模式
单例模式 单例模式饿汉式懒汉式 单例模式 解释:一个类只能有一个实例 单例模式可以分为两种 饿汉式 和 懒汉式 饿汉式 也被称为预加载,即 在加载类的时候,就将实例创建出来,加载到内存,不管之后会不会使用这个实例 …...
社区分享|杭银消费金融基于MeterSphere开展接口自动化测试
杭银消费金融有限公司(以下简称“杭银消费金融”)成立于2015年12月,是经中国银保监会批准,由杭州银行作为主发起人,联合滴滴出行、中国银泰等企业组建的持牌消费金融机构,注册资本为25.61亿元。杭银消费金融…...
阿里云2核2G云服务器99元一年!3M带宽的ECS云服务器哦
经济型e实例2核2G3M带宽优惠价99元一年 除了轻量服务器配置,经济型e实例2核2G3M配置也成为了用户关注的焦点。这款云服务器以99元一年的价格,适合个人和普通企业用户搭建网站、开发测试等需求。 我买的是阿里云这款99元的云服务器,活动参与地…...
【工程部署】在RK3588上部署OCR(文字检测识别)(DBNet+CRNN)
硬件平台: 1、firefly安装Ubuntu系统的RK3588; 2、安装Windows系统的电脑一台,其上安装Ubuntu18.04系统虚拟机。 参考手册:《00-Rockchip_RKNPU_User_Guide_RKNN_API_V1.3.0_CN》 《RKNN Toolkit Lite2 用户使用指南》 1、文…...
Dockerfile运行容器不立即退出
1. 问题描述 运行容器结束,docker container立即退出。 2. 解决方案 在dockerfile中,添加如下命令, ENTRYPOINT ["tail", "-f", "/dev/null"]...
基因检测技术的发展与创新:安全文件数据传输的重要作用
基因是生命的密码,它决定了我们的身体特征、健康状况、疾病风险等。随着基因检测技术的高速发展,我们可以通过对基因进行测序、分析和解读,更深入地认识自己,预防和治疗各种遗传性疾病,甚至实现个性化医疗和精准健康管…...
Flink SQL自定义标量函数(Scalar Function)
使用场景: 标量函数即 UDF,⽤于进⼀条数据出⼀条数据的场景。 开发流程: 实现 org.apache.flink.table.functions.ScalarFunction 接⼝实现⼀个或者多个⾃定义的 eval 函数,名称必须叫做 eval,eval ⽅法签名必须是 p…...
【第2章 Node.js基础】2.4 Node.js 全局对象(二) process 对象
process对象是一个全局对象,提供当前Node.js 进程信息并对其进行控制。通常用于编写本地命令行程序。 1.进程事件 process对象是EventEmitter类的实例,因此可以使用事件的方式来处理和监听process对象的各种事件。以下是一些常用的process对象事件&…...
觉非科技发布【轻地图高速NOA智驾方案】|地平线,觉非科技,MobileDrive超捷生态协作实现技术落地
11月10日,2023世界新汽车技术合作生态展期间,觉非科技正式发布了基于地平线征程系列以及MobileDrive超捷规控系统的【轻地图高速NOA智驾解决方案】。该方案首次实现了从芯片能力输出、到数据闭环建设、再到规控部署的产业生态链协作与打通,为…...
竞赛 车道线检测(自动驾驶 机器视觉)
0 前言 无人驾驶技术是机器学习为主的一门前沿领域,在无人驾驶领域中机器学习的各种算法随处可见,今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂,看上去无从下手。那么面对这样极其…...
128. 最长连续序列
这道题最简单的想法就是排序计数,但是复杂度为O(nlogn),不符合题意 于是采用哈希表的方法 将所有数字存放在哈希表中,然后开始逐个寻找。 比如当前遍历到x,如果x-1也存在哈希表中,那就从x-1开始遍历最长连续序列&#…...
设计模式-设计原则
文章目录 设计模式-设计原则单一职责原则开闭原则里氏替换原则依赖倒转原则接口隔离原则合成复用原则迪米特法则 设计模式-设计原则 单一职责原则 单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中。 有时候类的功能并不…...
MongoDB基础运维
mongodb的基础概念介绍 database #数据库 collection #集合,类似于mysql中的表 filed #类似于mysql中字段 document #每行的记录 连接客户端 mongo ip:port 例如mongo 127.0.0.1:27017 mongo客户端的命…...
侧击雷如何检测预防
侧击雷是一种雷击的形式,指的是雷电从建筑物的侧面打来的直接雷击。侧击雷对高层建筑物的防雷保护提出了更高的要求,因为一般的避雷带或避雷针不能完全保护住建筑物的侧面。侧击雷可能会对建筑物的结构、设备和人员造成严重的损害,甚至引发火…...
检索搜索信息能力
(一)搜索工具的选择 谷歌 > 微信搜一搜 > 抖音等短视频 > 百度 (二)搜索方式 一,搜索内容的分类 信息类学习类工具类 二,谷歌浏览器的搜索技巧 1、“搜索内容” 限定完整出现的词 如下图搜…...
设计大咖亲授:Figma中文环境设置全攻略!
作为UI设计师,你一定很熟悉Figma,Figma是一款专注于UI/UX设计的在线协作工具,使用非常高效方便,不需要下载和安装。它只需要通过浏览器编辑,在国外很受欢迎。但是Figma对于国内的小伙伴来说,使用Figma有一定…...
华为Hcia-数通学习(更改策略)
方法:书籍视频题目训练 书籍:华为HCNA网络技术学习指南。 视频:网络工程师学习路线_哔哩哔哩_bilibili 有过一点基础。考软考网络工程师的时候做了大量笔记,回去复习了一遍。现在准备找工作了,开始学习华为认证的网…...
数据校验:Spring Validation
Spring Validation概述 在开发中,我们经常遇到参数校验的需求,比如用户注册的时候,要校验用户名不能为空、用户名长度不超过20个字符、手机号是合法的手机号格式等等。如果使用普通方式,我们会把校验的代码和真正的业务处理逻辑耦…...
CSS怎么选择除了第一个子元素外的其余同级子元素
使用 CSS 的:not()伪类选择器和:nth-child()伪类选择器 要通过CSS的代码选择某一个元素的除了第一个子元素外的其余的跟第一个子元素同级的子元素,可以结合使用CSS的:not()伪类选择器和:nth-child()伪类选择器进行选择。大致的语法如下: .parent > …...
Mac下eclipse配置JDK
目录 一、配置JDK,需要电脑下载Java并且配置环境 (1)、左上角找到“Eclipse”-->“Preferences...” (2)、找到“Java”-->“Installde JREs”-->界面显示电脑所安安装的Java;若没有需要点击“Add”进行配置 ①、选择“Standard VM”--&g…...
收藏!小白程序员必看:轻松入门大模型核心概念MCP与Skill,解锁AI能力新姿势!
本文通过生活化比喻,深入浅出地解释了AI领域中的MCP和Skill两大核心概念。MCP如同AI世界的“USB接口”,是标准化的连接协议,让AI能调用外部工具;Skill则像“工作手册”,是工作规范/技能模板,告诉AI在不同场…...
DLSS Swapper深度解析:游戏性能优化实战指南
DLSS Swapper深度解析:游戏性能优化实战指南 【免费下载链接】dlss-swapper 项目地址: https://gitcode.com/GitHub_Trending/dl/dlss-swapper DLSS Swapper作为一款开源游戏性能优化工具,专为解决PC玩家面临的DLSS版本管理难题而生。在3A游戏对…...
蛋白质功能预测:从序列同源性到多模态深度学习
点击 “AladdinEdu,你的AI学习实践工作坊”,注册即送-H卡级别算力,沉浸式云原生集成开发环境,80G大显存多卡并行,按量弹性计费,教育用户更享超低价。 摘要:蛋白质功能预测是注释未知蛋白质、揭示…...
告别随机色!YOLOv7检测框颜色固定与高级样式自定义全攻略(从PIL到OpenCV)
YOLOv7检测框样式深度定制:从颜色固化到多语言字体支持实战 在计算机视觉项目的实际部署中,检测框的可视化效果往往直接影响最终用户体验。YOLOv7作为当前主流的目标检测框架,其默认的随机颜色分配和有限的字体支持可能无法满足专业场景需求。…...
用STM32CubeMX配置PWM捕获:从定时器选型到串口输出全流程
STM32CubeMX实战:PWM捕获全流程解析与调试技巧 在嵌入式开发中,精确测量PWM信号的周期和占空比是常见需求。本文将带你从零开始,使用STM32CubeMX和HAL库完成PWM捕获功能的完整实现。不同于简单的教程复制,我们会深入探讨两种捕获…...
OpenSSL实战指南:在VSCode中搭建C语言开发环境
1. 为什么要在VSCode中配置OpenSSL开发环境 OpenSSL作为业界广泛使用的加密工具库,几乎支撑着互联网安全通信的半壁江山。从HTTPS协议到数字证书验证,从数据加密到安全传输,OpenSSL的身影无处不在。对于C语言开发者来说,掌握OpenS…...
光伏储能并网仿真实战手记:PQ控制与扰动观察法的那些事儿
光伏储能三相PQ恒功率并网控制仿真(附参考文献及文档)①网侧 光伏储能三相PQ恒功率并网控制仿真(附参考文献及文档)①网侧:采用PQ恒功率控制,参考文献《微电网及其逆变器控制技术的研究》②储能控制:直流母线电压外环,电池电流内环双闭环控制策略直流母线…...
MouseClick:让重复点击成为过去的智能鼠标自动化工具
MouseClick:让重复点击成为过去的智能鼠标自动化工具 【免费下载链接】MouseClick 🖱️ MouseClick 🖱️ 是一款功能强大的鼠标连点器和管理工具,采用 QT Widget 开发 ,具备跨平台兼容性 。软件界面美观 ,操…...
用STM32F103做个智能门禁卡管理终端:RC522读卡、OLED菜单、4x4键盘改密码,附工程源码
基于STM32F103的智能门禁终端开发实战:从模块整合到系统优化 在物联网设备开发领域,将多个功能模块整合为一个稳定可靠的终端系统是开发者常面临的挑战。本文将深入探讨如何基于STM32F103RCT6微控制器构建一个功能完善的智能门禁管理终端,涵盖…...
Windows系统性能优化指南:使用RyTuneX提升系统响应速度
Windows系统性能优化指南:使用RyTuneX提升系统响应速度 【免费下载链接】RyTuneX RyTuneX is a cutting-edge optimizer built with the WinUI 3 framework, designed to amplify the performance of Windows devices. Crafted for both Windows 10 and 11. 项目地…...
