单例模式:保证一个类只有一个实例
单例模式:保证一个类只有一个实例
什么是单例模式?
在软件开发中,有些类只需要一个实例
,比如数据库连接池、线程池等。单例模式就是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点
。
实现单例模式的方法(最常见的五种)
1. 饿汉式
饿汉式是最简单的实现方式,它在类加载时就创建了实例,并且提供一个静态方法返回该实例。
/*** 单例模式 - 饿汉式* 优点:线程安全* 缺点:资源浪费*/
public class Singleton1 {// 1. 声明并创建静态实例private static Singleton1 instance = new Singleton1();// 2. 构造器私有private Singleton1() {}// 3. 公有的静态方法,获取实例public static Singleton1 getInstance() {return instance;}
}
jdk源码中的 Runtime 就使用了这种方式实现单例模式
Runtime部分源码
public class Runtime {// 声明并创建静态实例private static Runtime currentRuntime = new Runtime();/*** Returns the runtime object associated with the current Java application.* Most of the methods of class <code>Runtime</code> are instance* methods and must be invoked with respect to the current runtime object.** @return the <code>Runtime</code> object associated with the current* Java application.*/// 公有的静态方法,获取实例public static Runtime getRuntime() {return currentRuntime;}// 构造器私有/** Don't let anyone else instantiate this class */private Runtime() {}
2. 懒汉式
懒汉式是在第一次使用时才创建实例,它使用了延迟加载的方式。
/*** 单例模式 - 懒汉式* 优点:线程安全, 懒加载,避免了资源浪费* 缺点:在多线程环境下,每次调用getInstance()方法都需要进行同步,会影响性能*/
public class Singleton2 {// 1. 声明静态实例private static Singleton2 instance;// 2. 构造器私有private Singleton2() {};// 3. 静态公有方法,获取实例,对该方法进行加synchronized进行线程同步public static synchronized Singleton2 getInstance() {if (instance == null) {instance = new Singleton2();}return instance;}
}
3. 双检锁
双检锁是对懒汉式的改进,它使用了双重检查来提高性能。
/*** 单例模式 - 双重检索* 优点:线程安全、懒加载、性能好*/
public class Singleton3 {// 1. 声明私有实例,使用volatile修饰,保证可见性、防止指令重排private static volatile Singleton3 instance;// 2. 构造器私有private Singleton3() {};// 3. 静态公有方法,获取实例,加入双重检查代码public static Singleton3 getInstance() {if (instance == null) {synchronized (Singleton3.class) {if (instance == null) { // 双重检查instance = new Singleton3();}}}return instance;}
}
4. 静态内部类
静态内部类方式是利用了类加载机制来保证线程安全和延迟加载。
/*** 单例模式 - 静态内部类* 优点:线程安全、懒加载、性能好*/
public class Singleton4 {// 1. 私有静态内部类,内部创建静态实例private static class SingletonInstance {private static final Singleton4 INSTANCE = new Singleton4();}// 2. 构造器私有private Singleton4() {};// 3. 静态公有方法,获取实例public static Singleton4 getInstance() {return SingletonInstance.INSTANCE;}
}
5.枚举
借助了 JDK1.5 中添加的枚举来实现单例模式
/*** 单例模式 - 枚举* 优点:线程安全、性能好、防止反序列化重新创建新的对象*/
enum Singleton5 {INSTANCE; // 属性
}
单例模式的优点
- 提供了对唯一实例的控制,确保只有一个实例存在。
- 提供了全局访问点,方便其他类使用该实例。
- 避免了重复创建实例的开销,提高了性能。
单例模式的应用场景
- 数据库连接池:保证只有一个连接池实例,避免资源浪费。
- 配置文件管理器:保证只有一个实例读取和管理配置文件。
- 日志记录器:保证只有一个实例记录日志。
单例模式的注意事项
- 线程安全:在多线程环境下,需要考虑线程安全性,可以使用同步锁或者双重检查锁定来保证线程安全。
- 序列化和反序列化:如果单例类需要支持序列化和反序列化,需要添加readResolve()方法来返回单例实例。
- 类加载器:在使用单例模式时,需要注意类加载器的问题,确保只有一个类加载器加载单例类。
总结
单例模式是一种常用的设计模式,它可以确保一个类只有一个实例,并提供一个全局访问点。通过选择合适的实现方式,可以满足不同的需求。在使用单例模式时,需要注意线程安全性、序列化和反序列化、类加载器等问题。合理地使用单例模式可以提高性能,减少资源消耗,提高代码的可维护性和可扩展性。
相关文章:
单例模式:保证一个类只有一个实例
单例模式:保证一个类只有一个实例 什么是单例模式? 在软件开发中,有些类只需要一个实例,比如数据库连接池、线程池等。单例模式就是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。 实…...

【新版系统架构补充】-七层模型
网络功能和分类 计算网络的功能 :数据通信、资源共享、管理集中化、实现分布式处理、负载均衡 网络性能指标:速率、带宽(频带宽度或传送线路速率)、吞吐量、时延、往返时间、利用率 网络非性能指标:费用、质量、标准化…...

第2章 C语言概述
本章介绍以下内容: 运算符: 函数:main()、printf() 编写一个简单的C程序 创建整型变量,为其赋值并在屏幕上显示其值 换行字符 如何在程序中写注释,创建包含多个函数的程序,发现程序的错误 什么是关键字 C程…...
vscode vue3开发常用插件(附Prettier格式化配置)
必不可少插件(名称可能不全): 1、Chinese (Simplified) (简体中文) Language 2、Prettier - Code formatter 3、Vue 3 Snippets 4、Vue Language Features (Volar) 可选插件: 5、Auto Close Tag 6、Vue Theme Prettier格式化配置: 按ctr…...

【微信小程序】van-uploader实现文件上传
使用van-uploader和wx.uploadFile实现文件上传,后端使用ThinkPHP。 1、前端代码 json:引入van-uploader {"usingComponents": {"van-uploader": "vant/weapp/uploader/index"} }wxml:deletedFile是删除文件函…...
人工智能在计算机视觉中的应用与挑战
引言 计算机视觉是人工智能领域的一个重要分支,旨在让计算机能够像人一样理解和解释视觉信息,实现图像和视频的自动识别、理解和分析。计算机视觉技术已经在许多领域产生了深远的影响,如人脸识别、自动驾驶、医学影像分析等。本篇博客将深入…...

以太网接口指示灯状态分析和电路设计
一、RJ45以太网连接器介绍 以带网络隔离变压器的RJ45接头为例,如HR911105A,其技术参数如下 原理框图 指示灯部分 二、PHY芯片 phy芯片以DP83848CVV/NOPB为例,查看数据手册。引脚26,引脚27和引脚28和LED灯相关,如下截…...

Redis的基础
一、进入redis 内部 / 关闭 # 方式一: // 进入redis redis-cli // 有密码输入密码 :auth [username] password auth 123456 # 方式二: // 进入redis 并且输入密码 redis-cli -a 123456// 如果在docker 里面的则可以 docker exec -it redis…...

LeetCode 626. 换座位
题目链接:LeetCode 626. 换座位 题目描述 表名:Seat 编写SQL查询来交换每两个连续的学生的座位号。如果学生的数量是奇数,则最后一个学生的id不交换。 按 id 升序 返回结果表。 查询结果格式如下所示。 示例1: 题目分析 如…...

华为、阿里巴巴、字节跳动 100+ Python 面试问题总结(六)
系列文章目录 个人简介:机电专业在读研究生,CSDN内容合伙人,博主个人首页 Python面试专栏:《Python面试》此专栏面向准备面试的2024届毕业生。欢迎阅读,一起进步!🌟🌟🌟 …...
hash 模式和 history 模式的实现原理
hash 模式和 history 模式的实现原理: #后面的 hash 值的变化不会导致浏览器向服务器发出请求,浏览器不发出请求,就不会刷新页面。通过监听 hashchange 事件的变化可以知道 hash 值发生了哪些变化,然后根据 hash 值的变化来实现更…...

并发编程Part 2
1. JMM 问题:请你谈谈你对volatile的理解? volitile 是 Java 虚拟机提供的一种轻量级的同步机制 ,三大特性: 保证可见性 不保证原子性 禁止指令重排 线程之间如何通信? 通信是指线程之间以如何来交换信息。一般线程之间的通信…...
springboot异步多线程的实现
1、配置线程池相关参数 package com.xxx.test.config;import lombok.extern.slf4j.Slf4j; import org.springframework.aop.interceptor.AsyncUncaughtExceptionHandler; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation…...

测试相关基础概念与常见开发模型
目录 1. 什么是需求 1.1 需求的定义 1.2 为什么有需求?为什么需求对软件测试人员如此重要? 1.3 测试人员眼里的需求(重要) 1.4 如何深入了解需求 2. 测试用例 2.1 什么是测试用例 2.2 为什么有测试用例 3. 什么是BUG 3.1 BUG定义 3.2 如何描述一个BUG 3.3 如何定义bug的级别 …...

MySQL安装详细教程!!!
安装之前,先卸载你之前安装过的数据库程序,否则会造成端口号占用的情况。 1.首先下载MySQL:MySQL :: Download MySQL Community Server(下载路径) 2.下载版本不一样,安装方法略有不同;(版本5的安装基本一致,…...

前端下载文化部几种方法(excel,zip,html,markdown、图片等等)和导出 zip 压缩包
文章目录 1、location.href2、location.href3、a标签4、请求后端的方式5、文件下载的方式6、Blob和Base647、下载附件方法(excel,zip,html,markdown)8、封装下载函数9、导出 zip 压缩包相关方法(流方式) 总结 1、location.href //get请求 window.location.href url;2、locati…...
铠甲网络面试(部分)
如何用Redis实现分布式锁的?如果设置的超时时间到了,但占有锁的任务还未完成,怎么办?答案:定时任务进行检测与续约,具体参考 本博----《专题三分布式系统》之《第三章 集中式缓存Redis》之 《第三节 Redis底…...

elasticsearch 将时间类型为时间戳保存格式的时间字段格式化返回
dsl查询用法如下: GET /your_index/_search {"_source": {"includes": ["timestamp", // Include the timestamp field in the search results// Other fields you want to include],"excludes": []},"query": …...
淘宝商品列表怎么通过接口形式导出?
淘宝是目前国内最大的电商平台之一,拥有海量的商品资源。但是,有时候我们需要对淘宝商品进行批量操作,比如进行价格比较、数据分析等等。这时候,我们就需要将淘宝商品列表导出。那么,淘宝商品列表怎么导出呢?又可以按…...

TWS真无线蓝牙耳机哪家好?六款口碑好的TWS真无线蓝牙耳机分享
为了帮助大家在这个充满选择的世界中找到最理想的蓝牙耳机,我们特别为您精心挑选了几款备受赞誉的产品,它们在音质、舒适度、功能和性价比等方面都有出色的表现。在本文中,我们将深入探讨这些蓝牙耳机的特点和优势,帮助您更好地了…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...
Cesium1.95中高性能加载1500个点
一、基本方式: 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...
解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错
出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上,所以报错,到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本,cu、torch、cp 的版本一定要对…...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

让AI看见世界:MCP协议与服务器的工作原理
让AI看见世界:MCP协议与服务器的工作原理 MCP(Model Context Protocol)是一种创新的通信协议,旨在让大型语言模型能够安全、高效地与外部资源进行交互。在AI技术快速发展的今天,MCP正成为连接AI与现实世界的重要桥梁。…...

USB Over IP专用硬件的5个特点
USB over IP技术通过将USB协议数据封装在标准TCP/IP网络数据包中,从根本上改变了USB连接。这允许客户端通过局域网或广域网远程访问和控制物理连接到服务器的USB设备(如专用硬件设备),从而消除了直接物理连接的需要。USB over IP的…...

Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
站群服务器的应用场景都有哪些?
站群服务器主要是为了多个网站的托管和管理所设计的,可以通过集中管理和高效资源的分配,来支持多个独立的网站同时运行,让每一个网站都可以分配到独立的IP地址,避免出现IP关联的风险,用户还可以通过控制面板进行管理功…...
MySQL 主从同步异常处理
阅读原文:https://www.xiaozaoshu.top/articles/mysql-m-s-update-pk MySQL 做双主,遇到的这个错误: Could not execute Update_rows event on table ... Error_code: 1032是 MySQL 主从复制时的经典错误之一,通常表示ÿ…...