单例模式:保证一个类只有一个实例
单例模式:保证一个类只有一个实例
什么是单例模式?
在软件开发中,有些类只需要一个实例,比如数据库连接池、线程池等。单例模式就是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点。
实现单例模式的方法(最常见的五种)
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高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
【JavaEE】-- HTTP
1. HTTP是什么? HTTP(全称为"超文本传输协议")是一种应用非常广泛的应用层协议,HTTP是基于TCP协议的一种应用层协议。 应用层协议:是计算机网络协议栈中最高层的协议,它定义了运行在不同主机上…...
UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)
UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中,UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化…...
IP如何挑?2025年海外专线IP如何购买?
你花了时间和预算买了IP,结果IP质量不佳,项目效率低下不说,还可能带来莫名的网络问题,是不是太闹心了?尤其是在面对海外专线IP时,到底怎么才能买到适合自己的呢?所以,挑IP绝对是个技…...
Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...
系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型
本文较长,建议点赞收藏,以免遗失。更多AI大模型应用开发学习视频及资料,尽在聚客AI学院。 本文通过代码驱动的方式,系统讲解PyTorch核心概念和实战技巧,涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...
Ubuntu系统复制(U盘-电脑硬盘)
所需环境 电脑自带硬盘:1块 (1T) U盘1:Ubuntu系统引导盘(用于“U盘2”复制到“电脑自带硬盘”) U盘2:Ubuntu系统盘(1T,用于被复制) !!!建议“电脑…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
xmind转换为markdown
文章目录 解锁思维导图新姿势:将XMind转为结构化Markdown 一、认识Xmind结构二、核心转换流程详解1.解压XMind文件(ZIP处理)2.解析JSON数据结构3:递归转换树形结构4:Markdown层级生成逻辑 三、完整代码 解锁思维导图新…...
WebRTC调研
WebRTC是什么,为什么,如何使用 WebRTC有什么优势 WebRTC Architecture Amazon KVS WebRTC 其它厂商WebRTC 海康门禁WebRTC 海康门禁其他界面整理 威视通WebRTC 局域网 Google浏览器 Microsoft Edge 公网 RTSP RTMP NVR ONVIF SIP SRT WebRTC协…...
