单例模式:保证一个类只有一个实例
单例模式:保证一个类只有一个实例
什么是单例模式?
在软件开发中,有些类只需要一个实例
,比如数据库连接池、线程池等。单例模式就是一种设计模式,用于确保一个类只有一个实例,并提供一个全局访问点
。
实现单例模式的方法(最常见的五种)
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真无线蓝牙耳机分享
为了帮助大家在这个充满选择的世界中找到最理想的蓝牙耳机,我们特别为您精心挑选了几款备受赞誉的产品,它们在音质、舒适度、功能和性价比等方面都有出色的表现。在本文中,我们将深入探讨这些蓝牙耳机的特点和优势,帮助您更好地了…...

【力扣数据库知识手册笔记】索引
索引 索引的优缺点 优点1. 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。2. 可以加快数据的检索速度(创建索引的主要原因)。3. 可以加速表和表之间的连接,实现数据的参考完整性。4. 可以在查询过程中,…...

Redis相关知识总结(缓存雪崩,缓存穿透,缓存击穿,Redis实现分布式锁,如何保持数据库和缓存一致)
文章目录 1.什么是Redis?2.为什么要使用redis作为mysql的缓存?3.什么是缓存雪崩、缓存穿透、缓存击穿?3.1缓存雪崩3.1.1 大量缓存同时过期3.1.2 Redis宕机 3.2 缓存击穿3.3 缓存穿透3.4 总结 4. 数据库和缓存如何保持一致性5. Redis实现分布式…...

【JVM】- 内存结构
引言 JVM:Java Virtual Machine 定义:Java虚拟机,Java二进制字节码的运行环境好处: 一次编写,到处运行自动内存管理,垃圾回收的功能数组下标越界检查(会抛异常,不会覆盖到其他代码…...

智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...

DIY|Mac 搭建 ESP-IDF 开发环境及编译小智 AI
前一阵子在百度 AI 开发者大会上,看到基于小智 AI DIY 玩具的演示,感觉有点意思,想着自己也来试试。 如果只是想烧录现成的固件,乐鑫官方除了提供了 Windows 版本的 Flash 下载工具 之外,还提供了基于网页版的 ESP LA…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...

Python基于历史模拟方法实现投资组合风险管理的VaR与ES模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档),如需数据代码文档可以直接到文章最后关注获取。 1.项目背景 在金融市场日益复杂和波动加剧的背景下,风险管理成为金融机构和个人投资者关注的核心议题之一。VaR&…...

并发编程 - go版
1.并发编程基础概念 进程和线程 A. 进程是程序在操作系统中的一次执行过程,系统进行资源分配和调度的一个独立单位。B. 线程是进程的一个执行实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。C.一个进程可以创建和撤销多个线程;同一个进程中…...
Vue3中的computer和watch
computed的写法 在页面中 <div>{{ calcNumber }}</div>script中 写法1 常用 import { computed, ref } from vue; let price ref(100);const priceAdd () > { //函数方法 price 1price.value ; }//计算属性 let calcNumber computed(() > {return ${p…...