单例模式的四种创建方式
前言
单例模式是日常开发中最常见的一种设计模式,常用来做为池对象,或者计数器之类的需要保证全局唯一的场景。
单例模式的目的是保证在整个程序中只存在一个对象实例,使用单例一个前提条件就是构造器私有化,不允许通过new 对象的方式。单例模式的实现主要方式有如下几种:
1、饿汉式实现
2、使用枚举类实现
3、懒汉式使用双重检查锁实现。
4、使用静态内部类实现
“饿汉式”
饿汉式:顾名思义就是很"饥饿",初始化就创建设好了实例。
public class Demo1 {private static Demo1 demo1 = new Demo1();private void Demo1() {}public static Demo1 getInstance() {return demo1;}
}
“懒汉式” -双重检查锁
为什么要使用双重检查锁?因为如果在并发的状态下,如果A线程先进来,判断demo2为null,然后创建实例对象,在判断了为null的这个时间点,B线程也进来了判断demo2为null,也去创建实例,这样就不能保证单例。
public class Demo2 {private volatile static Demo2 demo2 = null;private void Demo2() {}public static Demo2 getInstance() {if (demo2 == null) {synchronized(Demo2.class) {if (demo2 == null) {demo2 = new Demo2();}}}return demo2;}}
“懒汉式” -使用静态内部类的方式实现
使用静态内部类的方式实现的单例式利用了java的特性,就是static属于类,在初始化的时候就已经执行了,且static修饰的对象或者静态代码块只执行一次。
public class Demo3 {private static Demo3 demo3;private void Demo3() {}private static class HolderClass {private static Demo3 demo3 = new Demo3();}public static Demo3 getInstance() {return HolderClass.demo3;}
}
枚举方式
枚举方式利用了枚举的特性,enum修饰的类被称之为枚举类,java不允许通过反射来创建enum类,同时enum修饰的类默认继承了Enum类,其构造函数为private修饰的,因此枚举类具有天然的单例特性,很适合用做单例模式。
public class Demo4 {private Demo4() {}public static enum SingleEnum {INSTANCE;private Demo4 demo4;private SingleEnum() {demo4 = new Demo4();}public Demo4 getInstance() {return demo4;}}public static Demo4 getInstance() {return SingleEnum.INSTANCE.getInstance();}// 测试public static void main(String[] args) {Demo4 instance = getInstance();}
}
下面来看一个单例模式的典型应用场景:
JefLogTail采集工具中的server端,在处理日志多线程入库时,为了防止反复的创建线程池导致服务器压力大,因此采用单例模式来定义线程池的获取。如下:
public class LogHandle extends ServerMessageHandler {private LogSave logSave;@Overrideprotected void channelRead0(ChannelHandlerContext channelHandlerContext, Message message) throws Exception {try {
/* String content = (String) message.getContent();String ip = message.getAttachment("ip");String fileName = message.getAttachment("fileName");System.out.println("ip地址:" + ip);System.out.println("文件名称:" + fileName);*/ThreadPoolCfg.getThreadPool().execute(new Runnable() {@Overridepublic void run() {logSave.save(message);}});// 多线程处理} catch (Exception e) {e.printStackTrace();}}public void setLogSavePlan(LogSave logSave) {this.logSave = logSave;}
}
相关文章:
单例模式的四种创建方式
前言 单例模式是日常开发中最常见的一种设计模式,常用来做为池对象,或者计数器之类的需要保证全局唯一的场景。 单例模式的目的是保证在整个程序中只存在一个对象实例,使用单例一个前提条件就是构造器私有化,不允许通过new 对象…...
Nginx+Keepalived 中的脑裂现象
如何解决和预防 NginxKeepalived 中会出现的脑裂现象? Nginx是一种高性能的Web服务器和反向代理服务器,可以处理大量并发请求。Keepalived是一种开源软件,用于实现IP负载均衡和故障转移。在Nginx和Keepalived结合使用时,可以通过将多个Ngin…...
04 KVM虚拟化网络概述
文章目录 04 KVM虚拟化网络概述4.1 Linux Bridge4.2 Open vSwitch 04 KVM虚拟化网络概述 为了使虚拟机可以与外部进行网络通信,需要为虚拟机配置网络环境。KVM虚拟化支持Linux Bridge、Open vSwitch网桥等多种类型的网桥。如图1所示,数据传输路径为“虚…...
110页智慧农业解决方案(农业信息化解决方案)(ppt可编辑)
本资料来源公开网络,仅供个人学习,请勿商用,如有侵权请联系删除。 第一部分 智慧农业概述 智慧农业以农业资源为基础、市场为导向、效益为中心、产业化为抓手,面向农业管理部门、农技推广部门、农业企业、农业园区和基地、农业专…...
Java知识体系及聊天室程序
Java知识体系结构梳理如下: 基础语法:Java的基本语法,包括数据类型、运算符、控制语句、数组等。 面向对象编程:Java是一种面向对象的编程语言,需要掌握类、对象、继承、多态等概念。 异常处理:Java提供了…...
java的详细发展历程
Java是一种跨平台、面向对象的编程语言,具有简单性、可移植性、安全性等特点。Java的历史可以追溯到上世纪90年代初期,以下是Java的详细发展历程: 1991年,Sun Microsystems公司的James Gosling和他的团队开始开发一种名为Oak的编程…...
丢石子
I 一堆石子有n个,两人轮流取.先取者第1次可以取任意多个,但不能全部取完.以后每次取的石子数不能超过上次取子数的2倍。取完者胜.先取者负输出"Second win".先取者胜输出"First win". 思路: 任何正整数都可以表示为不连续斐波那契…...
skywalking手动上报一些指标信息
skywalking的相关概念我就不介绍了,有兴趣可以参看官网文档 以下提供以下简单示例手工上报一些对问题排查比较有用的一些信息。当然这些内容你也可以写成探针插件的形式,怎么开发探针插件也自行参考官方文档。此处仅在项目框架层面提供一些简单的示例&am…...
NUMA详解
目录 NUMA简介 NUMA开启与关闭 查看系统是否支持 关闭方法 numactl --hardware介绍 没有安装numactl工具下查看NUMA架构节点数: 查看每个NUMA节点的CPU使用情况: 看每个NUMA节点的内存使用情况: 查看NUMA下指定进程的运行情况 创建…...
H68K在Armbina系统下开AP
背景需求替代路由器,网上找了一大堆都不行 最后成功开启了AP 参考了两篇文章, 一篇是如何创建热点, 一篇是如何开启5G 树莓派4B创建5Ghz WiFi热点 – 风声 https://www.hncldz.com/2020/02/01/%e6%a0%91%e8%8e%93%e6%b4%be4b%e5%88%9b%e5%bb%ba5ghz-wifi%e7%83%ad%e7%82%b…...
还不懂Redis?看完这个故事就明白了!
还不懂Redis?看完这个故事就明白了! 我是Redis 你好,我是Redis,一个叫Antirez的男人把我带到了这个世界上。 说起我的诞生,跟关系数据库MySQL还挺有渊源的。 在我还没来到这个世界上的时候,MySQL过的很辛苦,互联网发展的越来越快,它容纳的数据也越来越多,用户请求也…...
Haproxy负载均衡集群
1.Haproxy支持四层和七层 2.haproxy常用的调度算法? 3.LSV/NGINX/HAPROXT的区别? 4. 5.Haproy负载均衡部署 实验需求 利用Haproxy的运用配置出负载均衡调度器,以此来调用两台Nginx服务器进行工作 实验所需组件 Haproxy服务器:192…...
17.计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度
说明书 MATLAB代码:计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度 关键词:碳捕集 虚拟电厂 需求响应 优化调度 电转气协同调度 参考文档:《计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度》完全复现 仿真平台:…...
企业数字化管理中,数据治理到底怎么“治”
随着信息化、数字化的理念、技术及其应用在社会的方方面面进行扩散,数据的规模和丰富程度已经达到了一个新的高度,所以当下如何更进一步利用好数据,充分发挥数据的价值,将其真正变为高质量的数据资产成为了企业要面对的重要问题&a…...
《HelloGitHub》第 85 期
兴趣是最好的老师,HelloGitHub 让你对编程感兴趣! 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等,涵盖多种编程语言 …...
自动驾驶人机交互HMI产品技术方案
1. 概述 1.1 目的 本文档描述集卡自动驾驶系统中HMI产品的技术方案,设计人员遵循本方案进行设计,为项目开发实施提供技术方案保障。 1.2 范围 本文档适用于HMI产品项目。本文档用于指导HMI产品项目的UI、前端开发过程。 1.3 术语与缩写 术语/缩写 描述 HMI...
开发感悟20230426
一、element-ui样式设置 1. 可以直接在css中写个样式文件,把对应的类名改写样式,然后在main.js中引用,可以覆盖上面的,如果想给element-ui设置样式,不用设置deep了 2.可以直接修改引入的element-ui的样式,…...
C和C++的区别
C和C的区别 1、面向对象编程:C是面向对象的语言,而C语言则不支持面向对象编程。C提供了类、对象、封装、继承、多态等面向对象的特性,使得程序结构更加清晰、可读性更强。2、模板:C提供了模板的特性,使得程序员可以通…...
【力扣-141】 环形链表 + 【力扣-142】 环形链表 II
🖊作者 : Djx_hmbb 📘专栏 : 数据结构 😆今日分享 : 霍桑效应(霍索恩效应) : 是指那些意识到自己正在被别人观察的个人具有改变自己行为的倾向。 霍桑效应告诉我们:从旁人的角度,善意的谎言和夸奖真的可以造就一个人&a…...
云计算:优势与未来趋势
文章目录 前言一、云计算的优势1. 降低IT成本2. 提高工作效率3. 提高业务的可靠性和稳定性4. 提升安全性 二、未来发展趋势1. AI与云计算的融合2. 边缘计算的发展3. 多云的趋势4. 服务器和存储的创新 三、 行业应用案例1.金融行业2.医疗保健行业3.教育行业4.零售和物流行业 四、…...
液压串联弹性驱动器融合的双足机器人运动控制方法【附算法】
✨ 长期致力于双足机器人、运动控制、液压SEA、导纳控制、参数优化、快速步行研究工作,擅长数据搜集与处理、建模仿真、程序编写、仿真设计。 ✅ 专业定制毕设、代码 ✅ 如需沟通交流,点击《获取方式》 (1)基于无源性扰动观测器的…...
别再死记硬背了!用Python+Simulink仿真液压系统,帮你彻底搞懂帕斯卡原理和伯努利方程
用Python和Simulink仿真液压系统:从理论到实践的沉浸式学习 液压传动作为现代机械工程的核心技术之一,其理论基础往往让初学者望而生畏。帕斯卡原理、伯努利方程这些看似简单的公式背后,隐藏着复杂的物理现象和工程应用。传统的死记硬背方式不…...
从ARM Cortex-M到FPGA:手把手教你用AXI4-Lite搭建自定义外设(以Zynq-7000为例)
从ARM Cortex-M到FPGA:用AXI4-Lite实现自定义外设的工程实践 在嵌入式系统开发中,处理器与可编程逻辑的高效协同一直是提升性能的关键路径。当标准外设无法满足特定需求时,工程师往往需要在FPGA中设计定制硬件模块,并通过标准化总…...
别再纠结选哪种了!一文讲透无人机测深三剑客(激光雷达/测深仪/GPR)的实战选型指南
无人机测深技术三剑客:激光雷达、测深仪与探地雷达的深度选型指南 当无人机遇上水深测量,技术选型往往成为项目成败的关键。在河道整治、水库清淤、海岸线测绘等场景中,工程师们常面临一个核心难题:如何在激光雷达、测深仪和探地雷…...
备战蓝桥杯国赛【Day 17】
📌 写在前面:今天的4道题全部来自蓝桥杯真题,,核心考点包括:贪心策略排序、自定义比较器、差分思想、前缀和贪心选择。这些题目看似简单,但暗藏陷阱,是检验"代码实现能力"和"思维…...
地平线旭日X3派边缘AI开发板深度体验:从开箱到模型部署实战
1. 项目概述:当“地平线”升起时,我们看到了什么?最近几年,如果你关注边缘计算、机器人或者智能驾驶,那么“地平线”这个名字你一定不陌生。它早已不是那个遥远的天际线,而是成为了国内AI芯片领域一个响当当…...
Hermes Agent 任务追踪实战:3 类日志审计配置+2 步故障自愈触发流程
1. 日志审计不是“看日志”,而是让 Hermes Agent 自己学会写诊断报告 大多数人第一次配置 Hermes Agent 的任务追踪能力时,会下意识打开 logs/ 目录,用 tail -f 盯着滚动的文本发呆——这本质上还是在用人工方式做运维。真正的工程化日志审计,是让 Hermes Agent 在任务执行…...
Perplexity图标搜索效率提升300%:从零配置到精准获取的5步实战工作流
更多请点击: https://kaifayun.com 第一章:Perplexity图标资源搜索 在构建与 Perplexity AI 集成的前端应用或开发调试工具时,获取其官方图标资源是品牌一致性与用户体验的关键环节。Perplexity 官方未提供公开的图标下载中心,但…...
Hyper-V虚拟机文件迁移避坑指南:从C盘挪走Ubuntu,释放系统盘空间
Hyper-V虚拟机文件迁移实战:安全释放C盘空间的完整方案 当你在Windows系统上使用Hyper-V运行Ubuntu虚拟机时,是否注意到C盘空间正在被悄悄吞噬?许多技术爱好者初次接触Hyper-V时,往往直接采用默认设置,将所有虚拟机文件…...
2026四大主流收银系统深度横评:商拓、柚子、商琦云与银阁仕实战对比
在零售和餐饮行业数字化转型的浪潮中,收银系统早已超越了简单的“算账工具”范畴,成为了门店运营的中枢神经。很多店主在选型时容易陷入一个误区:只盯着硬件价格或者界面好不好看,却忽略了系统在高峰期的稳定性、数据链路的打通能…...
