二.单例模式
一.单例模式的定义
单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供该实例的全局访问点。
1.1.核心目标
- 唯一实例:限制类的实例化次数仅一次。
- 全局访问:提供统一的访问入口(通常是静态方法)。
1.2.实现步骤
- 私有化构造函数:禁止外部通过
new
创建实例。 - 静态私有成员:保存类的唯一实例。
- 静态公有方法:提供全局访问入口,如
getInstance()
.1.3.优点
- 资源共享:如数据库连接池、线程池、配置文件管理器等全局资源。
- 状态一致性:避免多个实例导致状态冲突(如计数器)。
- 性能优化:减少重复创建昂贵对象的开销
二.单例模式的实现方式
2.1.饿汉式实现
- 特点:类加载时立即创建实例(线程安全)。
- 优点:简单高效,无同步开销。
- 缺点:可能造成资源浪费(即使未使用也会创建实例)。
/*** 饿汉式单例*/
public class EagerSingleton {// 创建一个静态的实例,静态常量,在类加载的时候创建实例private static final EagerSingleton instance = new EagerSingleton();// 私有化构造方法,使的用者无法通过new关键字创建对象private EagerSingleton() {}// 提供获取实例的方法public static EagerSingleton getInstance() {return instance;}
}public class demo {public static void main(String[] args) {EagerSingleton instance = EagerSingleton.getInstance();EagerSingleton instance2 = EagerSingleton.getInstance();System.out.println(instance == instance2); // true}
}
2.2.懒汉式实现
- 特点:延迟实例化(首次调用
getInstance()
时创建)。 - 优点:首次创建后不再同步,兼顾性能与安全。
- 注意:必须使用
volatile
关键字(避免JVM指令重排序导致未初始化完全的错误实例)。
/*** 懒汉式单例普通实现*/
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}/*** 在多线程环境下,多个线程可能同时进入 if (instance == null) 条件块,* 并且每个线程都可能执行 new LazySingleton() 语句,从而导致创建多个实例* @return*/public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton(); // 这里可能会有并发问题}return instance;}
}/*** 懒汉式单例双重检查锁定实现*/
public class LazySingleton {// volatile 关键字是为了避免指令重排private static volatile LazySingleton instance;private LazySingleton() {}/*** 在多线程环境下,多个线程可能同时进入 if (instance == null) 条件块,* 并且每个线程都可能执行 new LazySingleton() 语句,从而导致创建多个实例* 所以需要使用 synchronized 关键字修饰 getInstance() 方法,* @return*/public static LazySingleton getInstance() {if (instance == null) {synchronized(LazySingleton.class){if (instance == null) {instance = new LazySingleton();}}}return instance;}
}
2.3.静态内部类实现
- 特点:利用类加载机制保证线程安全,延迟加载。
- 优势:线程安全(JVM保证类加载过程的互斥性)。无同步开销,高效延迟加载。
/*** 静态内部类实现单例模式*/
public class HolderSingleton {private HolderSingleton() {}/*** JVM 确保一个类只会被初始化一次,即使多个线程同时尝试加载该类。* 当 HolderSingleton 类被加载时,其内部的 Holder 类并不会立即被加载*/private static class Holder {private static final HolderSingleton INSTANCE = new HolderSingleton();}/*** 延迟加载* 只有当调用 getInstance() 方法时,才会触发 Holder.INSTANCE 的访问* 此时 JVM 才会加载并初始化 Holder 类,并创建 HolderSingleton 实例* @return*/public static HolderSingleton getInstance() {return Holder.INSTANCE;}
}
2.4.枚举实现
- 特点:天然防反射/序列化破坏,简洁安全。
- 调用方式:
Singleton.INSTANCE.doSomething()
- 优势:绝对单例(JVM保障)。自动处理序列化和反射攻击。
/*** 枚举单例模式*/
public enum EnumSingleton {///*** 枚举实例由JVM在类加载时静态初始化,保证线程安全* Java规范禁止通过反射创建枚举实例,避免传统单例被反射攻击的问题* 枚举的序列化机制仅保存枚举名称,反序列化时通过valueOf还原原实例,防止生成新对象*/INSTANCE; // 唯一实例/***实例方法*/public void whateverMethod() {System.out.println("whateverMethod");}
}public static void main(String[] args) {//调用EnumSingleton.INSTANCE.whateverMethod();}
三.应用场景
3.1.初始化开销
- 轻量级对象(CPU耗时<50ms,内存<1MB):
- 适用场景:配置管理器、工具类(如字符串处理器)16
- 饿汉式:实例在类加载时创建,启动速度快
- 重量级对象(数据库连接、大型缓存):
- 适用场景:数据库连接池、日志系统
- 静态内部类/DCL:延迟加载,避免启动阻塞
3.2.线程安全
- 高并发场景:
- 双重检查锁(DCL):通过
volatile
+同步块确保安全(如支付网关)36 - 枚举:JVM保障线程安全(如金融交易引擎)512
- 双重检查锁(DCL):通过
- 低并发场景:
- 静态内部类:无锁延迟加载(如配置文件读取器)
3.3.防破坏需求
- 枚举:Java规范禁止反射创建枚举实例
3.4.场景化推荐
场景 | 推荐模式 | 原因 |
---|---|---|
全局配置管理器 | 饿汉式 | 配置轻量且启动必用 |
数据库连接池 | 静态内部类 | 延迟加载避免启动卡顿,无锁线程安全 |
金融交易核心 | 枚举 | 防反射攻击,强一致性要求 |
高频工具类 | 饿汉式 | 无状态对象,快速访问 |
第三方服务代理 | 双重检查锁(DCL) | 按需加载+高并发安全(如支付网关) |
相关文章:
二.单例模式
一.单例模式的定义 单例模式是一种创建型设计模式,确保一个类只有一个实例,并提供该实例的全局访问点。 1.1.核心目标 唯一实例:限制类的实例化次数仅一次。全局访问:提供统一的访问入口(通常是静…...

从零开始开发纯血鸿蒙应用之网络检测
从零开始开发纯血鸿蒙应用 〇、前言一、认识 connection 模块1、获取默认网络2、获取网络能力信息3、解析网络能力信息3.1、NetCap3.2、NetBearType 二、实现网络检测功能1、申请权限2、获取默认网路的 NetCap 数组 三、总结 〇、前言 在之前的博文里,介绍了如何实…...

向 AI Search 迈进,腾讯云 ES 自研 v-pack 向量增强插件揭秘
作者:来自腾讯云刘忠奇 2025 年 1 月,腾讯云 ES 团队上线了 Elasticsearch 8.16.1 AI 搜索增强版,此发布版本重点提升了向量搜索、混合搜索的能力,为 RAG 类的 AI Search 场景保驾护航。除了紧跟 ES 官方在向量搜索上的大幅优化动…...
接IT方案编写(PPT/WORD)、业务架构设计、投标任务
1、IT 方案编写(PPT/WORD) 定制化方案:根据客户需求,提供涵盖云计算、大数据、人工智能等前沿技术领域的 PPT/WORD 方案编写服务,精准提炼核心价值,呈现专业技术内容。 逻辑清晰架构:采用…...
PostgreSQL 的扩展pageinspect
PostgreSQL 的扩展pageinspect pageinspect 是 PostgreSQL 提供的一个强大的底层扩展,允许数据库管理员和开发者直接检查数据库页面的内部结构。这个扩展对于数据库调试、性能优化和深入学习 PostgreSQL 存储机制非常有价值。 一、扩展概述 功能:提供…...
Unity——QFramework框架 内置工具
QFramework 除了提供了一套架构之外,QFramework 还提供了可以脱离架构使用的工具 TypeEventSystem、EasyEvent、BindableProperty、IOCContainer。 这些工具并不是有意提供,而是 QFramework 的架构在设计之初是通过这几个工具组合使用而成的。 内置工具…...

【win | docker开启远程配置】使用 SSH 隧道访问 Docker的前操作
在主机A pycharm如何连接远程主机B win docker? 需要win docker配置什么? 快捷配置-主机B win OpenSSH SSH Server https://blog.csdn.net/z164470/article/details/121683333 winR,打开命令行,输入net start sshd,启动SSH。 或者右击我的电脑&#…...

股指期货波动一个点多少钱?
很多朋友在交易股指期货时,都会好奇一个问题:股指期货波动一个点,我的账户里到底是赚了还是亏了多少钱?要搞清楚这个问题,其实很简单,只需要了解两个关键信息:股指期货的“交易单位”࿰…...
Kafka 快速上手:安装部署与 HelloWorld 实践(一)
一、Kafka 是什么?为什么要学? ** 在大数据和分布式系统的领域中,Kafka 是一个如雷贯耳的名字。Kafka 是一种分布式的、基于发布 / 订阅的消息系统,由 LinkedIn 公司开发,后成为 Apache 基金会的顶级开源项目 。它以…...
NGINX `ngx_stream_core_module` 模块概览
一、模块定位与功能 通用 TCP/UDP 代理 支持同时处理 TCP 和 UDP 流量,透明转发请求到后端服务器组(upstream)。可作为四层负载均衡,根据客户端 IP、权重、最少连接等策略将连接分发给后端。 预读(preread)…...

iOS、Android、鸿蒙、Web、桌面 多端开发框架Kotlin Multiplatform
Kotlin Multiplatform(简称 KMP)是 JetBrains 推出的开源跨平台开发框架 Kuikly 是腾讯开源的跨端开发框架,基于 Kotlin Multiplatform 技术构建,为开发者提供了技术栈更统一的跨端开发体验 KMP 不仅局限于移动端,它…...

探索C++标准模板库(STL):String接口的底层实现(下篇)
前引:在C的面向对象编程中,对象模型是理解语言行为的核心。无论是类的成员函数如何访问数据,还是资源管理如何自动化,其底层机制均围绕两个关键概念展开:this指针与六大默认成员函数。它们如同对象的“隐形守护者”&am…...

Flutter知识点汇总
Flutter架构解析 1. Flutter 是什么?它与其他移动开发框架有什么不同? Flutter 是 Google 开发的开源移动应用开发框架,可用于快速构建高性能、高保真的移动应用(iOS 和 Android),也支持 Web、桌面和嵌入式设备。。它与其他移动开发框架(如 React Native、Xamarin、原…...
vue组件的data为什么是函数?
vue组件的data为什么是函数? 在JS中,实例是通过构造函数创建的,每个构造函数可以new出多个实例,每个实例都会继承原型上的方法和属性。 在vue中,一个vue组件就是一个实例,当一个组件被复用多次࿰…...
AI图片售卖:是暴利新风口还是虚幻泡沫?哪些平台适合售卖AI图片
还记得去年大火的Midjourney吗?今年4月,Midjourney又发布了备受期待的V7版本,带来了更高的图像质量和创新功能。使用Midjourney、Stable Diffusion、DALLE等AI图片生成工具,创作者只需输入关键词即可获得高质量的原创图片。这一变…...

线性注意力 vs. 传统注意力:效率与表达的博弈新解
核心结论:线性注意力用计算复杂度降维换取全局建模能力,通过核函数和结构优化补足表达缺陷 一、本质差异:两种注意力如何工作? 特性传统注意力(Softmax Attention)线性注意力(Linear At…...

YOLO在QT中的完整训练、验证与部署方案
以下是YOLO在QT中的完整训练、验证与部署方案: 训练方案 准备数据集: 收集数据:收集与目标检测任务相关的图像数据集,可以是公开数据集如COCO、Pascal VOC,也可以是自定义数据集。标注数据:使用标注工具如…...
Vue在线预览excel、word、ppt等格式数据。
目录 前言 1.安装库 2.预览文件子组件代码 3、新建store/system.ts 4、父页面进行使用 总结 前言 纯前端处理文件预览,包含excel、word、ppt、txt等格式,不需要后端服务器进行部署,并且内网也可以使用。 1.安装库 npm install vue-offi…...

增量式网络爬虫通用模板
之前做过一个项目,他要求是只爬取新产生的或者已经更新的页面,避免重复爬取未变化的页面,从而节省资源和时间。这里我需要设计一个增量式网络爬虫的通用模板。可以继承该类并重写部分方法以实现特定的解析和数据处理逻辑。这样可以更好的节约…...

【JVM】三色标记法原理
在JVM中,三色标记法是GC过程中对象状态的判断依据,回收前给对象设置上不同的三种颜色,三色分为白色、灰色、黑色。根据颜色的不同,决定对象是否要被回收。 白色表示: 初始状态:所有对象未被 GC 访问。含义…...

【uniapp开发】picker组件的使用
项目uniapp,结合fastadmin后端开发 picker组件的官方文档说明 https://en.uniapp.dcloud.io/component/picker.html#普通选择器 先看效果: 1、实现设备类型的筛选;2、实现设备状态的筛选; 前端代码(节选࿰…...

【HarmonyOS Next之旅】DevEco Studio使用指南(三十一) -> 同步云端代码至DevEco Studio工程
目录 1 -> 同步云函数/云对象 1.1 -> 同步单个云函数/云对象 1.2 -> 批量同步云函数/云对象 2 -> 同步云数据库 2.1 -> 同步单个对象类型 2.2 -> 批量同步对象类型 3 -> 一键同步云侧代码 1 -> 同步云函数/云对象 说明 对于使用DevEco Studio…...
如何评估大语言模型效果
评估大模型微调后的效果是一个系统化的过程,需要结合客观指标和主观评估,并根据任务类型(分类、生成、回归等)选择合适的评估方法。 一、评估前的准备工作 数据集划分: 将数据分为 训练集、验证集 和 测试集ÿ…...

go-zero微服务入门案例
一、go-zero微服务环境安装 1、go-zero脚手架的安装 go install github.com/zeromicro/go-zero/tools/goctllatest2、etcd的安装下载地址根据自己电脑操作系统下载对应的版本,具体的使用自己查阅文章 二、创建一个user-rpc服务 1、定义user.proto文件 syntax &qu…...

Python控制台输出彩色字体指南
在Python开发中,有时我们需要在控制台输出彩色文本以提高可读性或创建更友好的用户界面。本文将介绍如何使用colorama库来实现这一功能。 为什么需要彩色输出? 提高可读性:重要信息可以用不同颜色突出显示更好的用户体验:错误信息…...
零基础在实践中学习网络安全-皮卡丘靶场(第十六期-SSRF模块)
最后一期了,感谢大家一直以来的关注,如果您对本系列文章内容有问题或者有更好的方法,请在评论区发送。 介绍 其形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能,但又没有对目标地址做严格过滤与限制导致攻击者可以传入任意…...

开源之夏·西安电子科技大学站精彩回顾:OpenTiny开源技术下沉校园,点燃高校开发者技术热情
开源之夏2025编程活动正在如火如荼的进行中,当前也迎来了报名的倒计时阶段,开源之夏组织方也通过高校行系列活动进入各大高校,帮助高校开发者科普开源文化、开源活动、开源技术。 6月4日 开源之夏携手多位开源技术大咖、经验型选手走进西安电…...
html、css(javaweb第一天)
HTML: 文字、图片、视频组成 由标签组成的语言 行内标签span//无语意 <img src"url">//图片 <a herf"url" target"是否开新页面">点击谁</a>//超链接 <video src"url" controls></video>//controls播放…...

解决数据库重启问题
最近部署软件时,发现mysql会一直在重启,记录下解决办法: 1.删除/home/dataexa/install/docker/datas/mysql路径下的data文件夹 2.重新构建mysql docker-compose up -d --build mysql 3.停掉所有应用,在全部重启: do…...

前后端交互过程中—各类文件/图片的上传、下载、显示转换
前后端交互过程中—各类文件/图片的上传、下载、显示转换 图片补充:new Blob()URL.createObjectURL()替代方案:FileReader.readAsDataURL()对比: tiff文件TIFF库TIFF转换通过url转换tiff文件为png通过文件选择的方式转换tiff文件为png 下…...