设计模式-单例模式(java)
单例是一种常用的设计模式,它的目的是确保一个类只有一个实例,并提供一个全局访问点。在Java编程语言中,实现单例有多种方法,本篇文章将介绍其中的两种实现方式。
方式一:饿汉式单例模式
饿汉式单例模式是最简单的实现方式,它的原理是在类加载时就创建实例,并在全局访问点返回该实例。以下是实现饿汉式单例模式的代码:
public class Singleton {private static Singleton instance = new Singleton();private Singleton() {// 私有化构造函数,防止外部实例化}public static Singleton getInstance() {return instance;}
}
在这个实现中,私有化的构造函数防止了外部实例化该类,而静态的instance变量在类加载时就被创建,getInstance方法返回该静态变量。由于instance是静态的,所以它在整个应用程序的生命周期内只被创建一次,保证了单例的实现。
方式二:懒汉式单例模式
懒汉式单例模式是另一种常用的实现方式,它的原理是在需要时才创建实例,并在全局访问点返回该实例。以下是实现懒汉式单例模式的代码:
public class Singleton {private static Singleton instance;private Singleton() {// 私有化构造函数,防止外部实例化}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
在这个实现中,静态的instance变量在第一次调用getInstance方法时才被创建,保证了懒加载的特性。需要注意的是,在多线程环境下,可能会有多个线程同时访问getInstance方法,导致实例被创建多次。为了解决这个问题,可以在getInstance方法上添加synchronized关键字,或使用双重检查锁定等线程安全的方式来实现懒汉式单例模式。多线程环境下调用单例可能会引发线程安全问题。下面通过代码示例演示如何在多线程环境下正确地调用单例。
首先,我们来看一个简单的单例实现:
public class Singleton {private static Singleton instance;private Singleton() {// 私有化构造函数,防止外部实例化}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
在单线程环境下,这个实现是可以正常工作的。但在多线程环境下,会有多个线程同时访问getInstance方法,可能会导致实例被创建多次,违背了单例模式的原则。
为了解决这个问题,我们可以给getInstance方法添加synchronized关键字,这样只有一个线程能够访问getInstance方法,其他线程需要等待:
public class Singleton {private static Singleton instance;private Singleton() {// 私有化构造函数,防止外部实例化}public static synchronized Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}
这个实现是线程安全的,但是synchronized关键字会导致性能下降,因为每个线程都需要获取锁。为了提高性能,可以使用双重检查锁定的方式来实现单例:
public class Singleton {private static volatile Singleton instance;private Singleton() {// 私有化构造函数,防止外部实例化}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}
这个实现使用了volatile关键字来保证多个线程能够正确地处理instance变量。另外,双重检查锁定的方式可以避免多个线程同时获取锁的情况,提高了性能。
总结
单例是一种常用的设计模式,在Java编程语言中有多种实现方式。饿汉式单例模式是最简单的实现方式,它的实例在类加载时就被创建。懒汉式单例模式则是在需要时才创建实例,具有懒加载的特性。无论选择哪种实现方式,都需要注意线程安全问题,避免实例被创建多次可以使用synchronized关键字或双重检查锁定的方式来实现线程安全的单例。需要注意的是,双重检查锁定需要使用volatile关键字来保证线程安全。
相关文章:
设计模式-单例模式(java)
单例是一种常用的设计模式,它的目的是确保一个类只有一个实例,并提供一个全局访问点。在Java编程语言中,实现单例有多种方法,本篇文章将介绍其中的两种实现方式。 方式一:饿汉式单例模式 饿汉式单例模式是最简单的实…...
Revit中复合墙图层的规则和CAD识别翻模墙
一、Revit中用于指定复合墙图层的规则,具体内容? 在编辑复合墙的结构时,请使用“指定图层”工具将“编辑部件”对话框中的行指定给图层或预览窗格中的区域,并遵循这些原则。 在预览窗格中,样本墙的各个行必须保持从左到右的顺序显…...
【DL】Paddle BML Codelab环境使用说明 - 知识点目录
《Paddle BML Codelab环境使用说明》 1. 编辑区 Code Cell 1.1 Code Cell 操作 Magic关键字/魔术命令 Magic命令含义%timeit测试单行语句的执行时间%%timeit测试代码块的执行时间%matplotlib inline显示matplotlib生成的图形%run调用外部python脚本%pdb 调试程序%pwd 查看当…...
python正则表达式处理文本-re模块
python正则表达式处理文本-re模块 1.概述 正则表达式通常用于含有大量文本处理的应用当中。例如,它们经常用作开发者使用的文本编辑程序的搜索模式,包括 vi,emacs 和现代集成开发环境。它们也是 Unix 命令行工具的组成部分,例如…...
换了固态硬盘需要重装系统吗?教你如何实现不重装系统!
电脑大家都用过嘛,如果您的计算机装的还是机械硬盘,想必阁下肯定是修身养性的高手,因为在这个浮躁的社会中,是很少有人能够忍受5分钟甚至更久的开机时间的,不仅开机慢,应用程序的响应速度也很慢,…...
网上医疗预约挂号系统
技术:Java、JSP等摘要:网上医疗预约挂号系统是主要是对居民的保健、护理、疾病预防等健康信息实行有效的预约挂号管理。医疗机构为居民建立完整的健康档案,安排体检以及实施免疫等预防措施。而基于Web的远程保健平台以网上医疗预约挂号系统为…...
专题:一看就会的C++类模板讲解 (1)
目录 一.类模板的作用 二.类模板的定义: 三.类模板的声明格式: 四.类模板对象 五.再举一个例子 一.类模板的作用 面向对象的程序设计编程实践中,我们可能会面临这样的问题:要实现比较两个数的大小。明明比较两个数的方法都一样…...
什么是“奥卡姆剃刀”,如何用“奥卡姆剃刀”解决复杂问题?复杂问题简单化
什么是“奥卡姆剃刀”,如何用“奥卡姆剃刀”解决复杂问题?复杂问题简单化问题什么是“奥卡姆剃刀”?如何使用“奥卡姆剃刀”解决问题复杂问题简单化“汉隆剃刀”小结问题 假设你在夜空中看到一颗闪闪发光的「不明飞行物」,你认为这会是什么呢…...
角谷定理(递归)
已知有角谷定理: 输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。如:例如数据22的变化过程ÿ…...
数学小课堂:微积分复盘(高等数学本质上是对趋势的动态描述,是对各种相关性抽象的表述。)
文章目录 引言I 复盘1.1 概念和表述1.2 现实与虚构1.3 有穷和无穷1.4 静态和动态1.5 直觉和逻辑II 通过数学逻辑,理解人生。2.1 精明与聪明2.2 朋友和理性的对手2.3 攒钱和赚钱2.4 荣誉和财富引言 高等数学本质上是对趋势的动态描述,是对各种相关性抽象的表述。 I 复盘 1.…...
JAVA线程池原理详解一
JAVA线程池原理详解一 一. 线程池的优点 线程是稀缺资源,使用线程池可以减少创建和销毁线程的次数,每个工作线程都可以重复使用。可以根据系统的承受能力,调整线程池中工作线程的数量,防止因为消耗过多内存导致服务器崩溃。 二…...
Windows平台Unity Camera场景实现轻量级RTSP服务和RTMP推送
技术背景随着VR技术在医疗、军事、农业、学校、景区、消防、公共安全、研学机构、展厅展馆,商场等场所普及,开发者对Unity平台下的直播体验提出了更高的要求。技术实现Unity平台下的RTMP推流、RTMP、RTSP播放前几年已经覆盖了Windows、Linux、Android、i…...
LSB 题解
今天来刷一道Misc的题目,LSB原理进行图片隐写 LSB原理 LSB是一种利用人类视觉的局限性设计的幻术 PNG和BMP图片中的图像像素一般是由RGB(RED红 GREEN绿 BLUE蓝)三原色组成 记住,JPG图片是不适合使用LSB隐写的,JPG图片对像数进行了有损压缩…...
离线部署docker与镜像
离线部署docker与镜像 1.离线部署docker 1).在docker官网上下载,合适的安装文件 本次使用的是“docker-20.10.9.tgz ” 下载地址:https://download.docker.com/linux/static/stable/x86_64/ [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下…...
Linux文件系统介绍(上)
使用 Linux 系统时,需要作出的决策之一就是为存储设备选用什么文件系统。大多数 Linux 发行版在安装时会非常贴心地提供默认的文件系统,大多数入门级用户想都不想就用了默认的那个。 使用默认文件系统未必就不好,但了解一下可用的选择有时也会…...
创建SpringBoot注意事项
作为一个java小白,你是否因为创建SpringBoot项目那些莫名其妙的错误搞得头皮发麻。不要慌张,这篇文章能帮你解决90%的问题【持续更新…】 本文结合创建SpringBoot项目的完整过程来讲 在idea中新建项目 虽然SpringBoot项目是由maven内核组成的࿰…...
2023年全国最新二级建造师精选真题及答案9
百分百题库提供二级建造师考试试题、二建考试预测题、二级建造师考试真题、二建证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 11.关于施工合同违约赔偿损失范围的说法,正确的是()。 A.…...
解决MySQL的 Row size too large (> 8126).
📢欢迎点赞 :👍 收藏 ⭐留言 📝 如有错误敬请指正,赐人玫瑰,手留余香!📢本文作者:由webmote 原创📢作者格言:无尽的折腾后,终于又回到…...
最优传输问题和Sinkhorn
最优传输问题 假设有M堆土,每堆土的大小是ama_mam,有N个坑,每个坑的大小是bnb_nbn,把单位土从土堆m运送到坑n的代价是c(m,n)c(m,n)c(m,n),如何找到一种运输方法填满坑,并且代价最小,这就是…...
Netty核心组件EventLoop源码解析
源码解析目标 分析最核心组件EventLoop在Netty运行过程中所参与的事情,以及具体实现 源码解析 依然用netty包example下Echo目录下的案例代码,单我们写一个NettyServer时候,第一句话就是 EventLoopGroup bossGroup new NioEventLoopGroup(…...
点赞收藏功能修复
从昨天下午开始修复因为逻辑错误导致的系统性错误,开始了大规模的修改。。。。。。。。现在基本修复了:计划广场唯一性,点赞,收藏。理论上已经全都修复了,但是还需要测试剩下测试的功能:举报申述功能...
Bilibili-Evolved离线缓存架构解析:构建无网络依赖的现代Web增强脚本
Bilibili-Evolved离线缓存架构解析:构建无网络依赖的现代Web增强脚本 【免费下载链接】Bilibili-Evolved 强大的哔哩哔哩增强脚本 项目地址: https://gitcode.com/gh_mirrors/bi/Bilibili-Evolved 在Web应用日益复杂的今天,离线能力已成为衡量用户…...
QT中使用MFC的示例工程
QT中使用MFC的示例工程 【下载地址】QT中使用MFC的示例工程 本仓库提供了一个在QT中使用MFC的示例工程,展示了如何在QT项目中引入MFC库,并使用MFC中的CString类和MessageBox方法。该示例工程适用于QT4和VS2013,但同样适用于QT3、QT4、QT5以及…...
IL-4诱导的M2INF巨噬细胞在二型免疫疾病及感染防御中的机制研究
摘要郑世进课题组通过深入研究IL-4诱导的M2INF巨噬细胞,揭示了其产生机制主要涉及糖代谢途径的重编程和组蛋白H3K4位点甲基化修饰的改变。这一发现为理解二型免疫疾病的发生发展提供了新的视角,并为相关疾病的治疗策略提供了理论依据。通过在小鼠模型&am…...
【亲测免费】 GeoMatch_src:基于边缘的模板匹配技术
GeoMatch_src:基于边缘的模板匹配技术 【下载地址】GeoMatch_srcVS2015OpenCV3.3版说明文档 本仓库提供了**GeoMatch_src**项目的更新版本,专为使用Visual Studio 2015和OpenCV 3.3环境的开发者设计。GeoMatch_src是一个基于边缘的模板匹配技术实现&…...
Arm硬件跟踪技术在嵌入式调试中的应用与优化
1. Arm Development Studio 跟踪技术深度解析在嵌入式系统开发领域,调试实时性要求高的系统一直是个棘手问题。传统断点调试会中断程序执行流,而日志输出又可能影响系统时序。Arm Development Studio提供的硬件跟踪技术完美解决了这一痛点——它能以纳秒…...
量子错误校正与离子阱系统的混合编码优化
1. 量子错误校正与离子阱系统的现状与挑战量子计算领域正经历着从NISQ(含噪声中等规模量子)时代向容错量子计算(FTQC)过渡的关键阶段。作为这一过渡的核心技术,量子错误校正(QEC)通过将逻辑量子…...
别再只会用menuconfig了!手把手教你为ESP32项目定制专属Kconfig配置菜单
从配置使用者到设计者:ESP32项目中的Kconfig高级定制指南 在ESP-IDF开发环境中,menuconfig几乎是每个开发者每天都要接触的工具。但大多数开发者仅仅停留在"使用者"层面——他们知道如何勾选选项、调整参数,却很少思考这些配置菜单…...
从零打造3D打印外壳:精准适配Adafruit Trellis控制器全流程
1. 项目概述与核心思路如果你手头有一块Adafruit Trellis按钮板,想把它变成一个握感扎实、外观专业的独立设备,比如一个迷你音乐控制器或者游戏手柄,那么为它设计并打印一个专属外壳,几乎是必经之路。这个项目远不止是把电路板塞进…...
告别‘屎山’代码:手把手教你阅读和复用《饥荒》官方Lua源码来开发Mod
从《饥荒》源码到高效Mod开发:解锁官方Lua代码的实战指南 当你在深夜调试第37个宠物AI的bug时,是否想过游戏开发者早已为你准备好了完美解决方案?《饥荒》的官方Lua源码就像一座未被充分发掘的金矿,里面藏着Klei工程师们精心设计的…...
