模式概述

单例模式(Singleton Pattern)是设计模式中最基础但应用最广泛的创建型模式之一,确保一个类仅有一个实例,并提供一个全局访问点。这种模式在需要全局唯一对象的场景中至关重要,如配置管理、线程池、数据库连接池等。

简单代码示例(五种经典实现方式对比)

  1. 饿汉式(线程安全)
    特点:线程安全但可能造成资源浪费
public class EagerSingleton {// 类加载时立即初始化(占用内存)private static final EagerSingleton instance = new EagerSingleton();private EagerSingleton() {}  // 私有构造public static EagerSingleton getInstance() {return instance;}
}
  1. 懒汉式(线程不安全)
public class LazySingleton {private static LazySingleton instance;private LazySingleton() {}public static LazySingleton getInstance() {if (instance == null) {instance = new LazySingleton();  // 多线程下可能创建多个实例}return instance;}
}
  1. 同步方法懒汉式(线程安全)
public class SynchronizedSingleton {private static SynchronizedSingleton instance;private SynchronizedSingleton() {}// 方法同步降低性能public static synchronized SynchronizedSingleton getInstance() {if (instance == null) {instance = new SynchronizedSingleton();}return instance;}
}
  1. 双重检查锁定(DCL)
    关键点:volatile防止指令重排序,避免返回未初始化完成的对象
public class DoubleCheckedSingleton {// volatile保证可见性和有序性private volatile static DoubleCheckedSingleton instance;private DoubleCheckedSingleton() {}public static DoubleCheckedSingleton getInstance() {if (instance == null) {  // 第一次检查synchronized (DoubleCheckedSingleton.class) {if (instance == null) {  // 第二次检查instance = new DoubleCheckedSingleton();}}}return instance;}
}
  1. 静态内部类
public class StaticNestedSingleton {private StaticNestedSingleton() {}// 静态内部类在首次使用时加载private static class SingletonHolder {private static final StaticNestedSingleton INSTANCE = new StaticNestedSingleton();}public static StaticNestedSingleton getInstance() {return SingletonHolder.INSTANCE;  // 由JVM保证线程安全}
}
  1. 枚举实现(防序列化破坏)
    《Effective Java》推荐方案:无偿提供序列化机制,防止反射攻击
public enum EnumSingleton {INSTANCE;  // 枚举常量本身就是单例public void doSomething() {System.out.println("Singleton working");}
}
// 使用方式:EnumSingleton.INSTANCE.doSomething();

技术细节

1.模式组成

组件职责说明
Singleton单例

2.优缺点

优点

  • 资源高效利用,减少内存开销:避免重复创建相同对象
  • 全局访问点,统一入口管理共享资源
  • 性能优化,减少对象创建开销(尤其重量级对象)

缺点

  • 违反单一职责原则
  • 测试困难,难以模拟依赖
  • 扩展性差,难以通过继承扩展功能

模式应用

Springboot中默认实例化的对象是单例,如果想声明成多例对象可以使用@Scope(“prototype”)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/916930.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/916930.shtml
英文地址,请注明出处:http://en.pswp.cn/news/916930.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

RFID 系统行业前沿洞察:技术跃迁与生态重构

在物联网与人工智能深度融合的时代,RFID(射频识别)系统正经历从 “单品识别工具” 到 “智能决策中枢” 的范式转变。这一技术凭借其非接触式数据采集、环境适应性强、全生命周期追溯等特性,在医疗、制造、农业、环保等领域引发连…

实现implements InitializingBean, DisposableBean 有什么用

在 Spring 框架中,实现 InitializingBean 和 DisposableBean 接口用于管理 Bean 的生命周期回调,分别控制 Bean 的初始化后和销毁前行为。具体作用如下:1. InitializingBean 接口public interface InitializingBean {void afterPropertiesSet…

GitLab 18.2 发布几十项与 DevSecOps 有关的功能,可升级体验【一】

沿袭我们的月度发布传统,极狐GitLab 发布了 18.2 版本,该版本带来了议题和任务的自定义工作流状态、新的合并请求主页、新的群组概览合规仪表盘、下载安全报告的 PDF 导出文件、中心化的安全策略管理(Beta)等几十个重点功能的改进…

如何快速把Clickhouse数据同步到Mysql

直接使用Clickhouse官方支持的Mysql引擎表的方式! 一、首先创建Mysql引擎表: CREATE TABLE saas_analysis.t_page_view_new_for_write (id Int64,shop_id Nullable(Int64),session_id Nullable(String),client_id Nullable(String),one_id Nullable(Str…

Kafka 重复消费与 API 幂等消费解决方案

Kafka 是一个高性能的分布式消息系统,但消费者重启、偏移量(offset)未正确提交或网络问题可能导致重复消费。API 幂等性设计则用于防止重复操作带来的副作用。本文从 Kafka 重复消费和 API 幂等性两个方面提供解决方案,重点深入探…

win11推迟更新

1、按住WINR2、输入以下命令:reg add "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsUpdate\UX\Settings" /v FlightSettingsMaxPauseDays /t reg_dword /d 10000 /f3、点击确定4、打开搜索框5、在搜索框里边输入更新,选择检查更新6、在暂停…

【uniapp】---- 使用 uniapp 实现视频和图片上传且都可以预览展示

1. 前言 接手得 uniapp 开发的微信小程序项目,新的开发需求是需要同时上传图片和视频,但是之前的上传都没有进行封装,都是每个页面需要的时候单独实现,现在新的需求,有多个地方都需要上传图片、视频或语音等,这样就需要封装一个组件,然后发现部分地方使用了 uni-file-p…

(nice!!!) (LeetCode 每日一题) 2411. 按位或最大的最小子数组长度(位运算+滑动窗口)

2411. 按位或最大的最小子数组长度 思路&#xff1a;位运算滑动窗口&#xff0c;时间复杂度0(n*32)。 **遍历每一个元素nums[i]&#xff0c;然后看能否改变它前面的元素nums[j]&#xff08; j<i &#xff09;&#xff0c; 当(nums[j]|nums[i])nums[j]时&#xff0c;说明当前…

算法竞赛阶段二-数据结构(36)数据结构双向链表模拟实现

//#include<bits/stdc.h> #include<iostream> using namespace std; const int N1e510; //定义 int e[N],pre[N],ne[N],h,id; int mp[N]; //头插 // 兵 y // x void push_front (int x) {id;e[id]x;mp[x]id;pre[id]h;ne[id]ne[h];//先修改新节点…

津发科技带你了解皮肤电信号中的SCL与SCR

皮肤电&#xff08;Electrodermal Activity, EDA&#xff09;作为一种非常容易获取的基本生理信号&#xff0c;可以很好地量化我们的情绪反应&#xff0c;被广泛应用于情感识别研究中。它代表机体受到刺激时皮肤电传导的变化。皮肤电反应作为交感神经系统功能的直接指标&#x…

spark的broadcast variables

在 Spark 中&#xff0c;广播变量&#xff08;Broadcast Variables&#xff09; 是一种特殊类型的共享变量&#xff0c;用于高效地在集群中的所有节点间分发大型只读数据集。它解决了 Spark 任务中频繁传输重复数据的性能问题&#xff0c;特别适用于需要在多个任务中重用相同数…

Python爬虫实战:研究Haul库相关技术构建电商数据采集与分析系统

1. 引言 1.1 研究背景与意义 随着电子商务的迅速发展,电商平台上的商品数据呈现爆炸式增长。这些数据蕴含着丰富的商业价值,如消费者行为分析、市场趋势预测、竞争对手监测等。然而,如何从海量的电商数据中获取有价值的信息,成为当前电商企业面临的重要挑战。 网络爬虫技…

Java:高频面试知识分享1

一、Java 语言核心特性&#xff08;面向对象编程&#xff09;核心知识点梳理&#xff1a;面向对象三大特性&#xff1a;封装&#xff1a;隐藏对象内部实现&#xff0c;通过 public 方法暴露接口&#xff08;例&#xff1a;类的 private 字段 get/set 方法&#xff09;。继承&a…

MybatisPlus-核心功能

目录 条件构造器 QueryWrapper UpdateWrapper LambdaQueryWrapper 自定义SQL 基本用法 多表关联 Service接口 CRUD 基本用法 Lambda 批量新增 条件构造器 除了新增以外&#xff0c;修改、删除、查询的SQL语句都需要指定where条件。因此BaseMapper中提供的相关方法…

RHCE综合项目:分布式LNMP私有博客服务部署

一、项目概述本次项目基于LNMP&#xff08;linux&#xff0c;nginx&#xff0c;mariadb&#xff0c;php&#xff09;搭建了一个私有的博客平台&#xff0c;本篇博客详细记录了该博客平台的服务部署全流程。在该项目中&#xff0c;使用了两台linux&#xff08;openeuler&#xf…

5种安全方法:如何删除三星手机上的所有内容

随着新的三星设备不断推出&#xff0c;在出售或捐赠旧手机之前&#xff0c;彻底清除旧手机上的数据以保护隐私至关重要。许多人不知道的是&#xff0c;简单的删除操作并不能完全清除三星设备上的数据&#xff0c;被删除的文件可能会处于不可见状态。本文介绍了如何彻底删除三星…

Vue 3 入门教程 2- Vue 组件基础与模板语法

一、Vue 组件基础在 Vue 中&#xff0c;组件是构建用户界面的基本单位&#xff0c;它可以将页面拆分成多个独立、可复用的部分。一个 Vue 组件通常以 .vue 文件名结尾&#xff0c;包含三个核心部分&#xff1a;模板&#xff08;Template&#xff09;、脚本&#xff08;Script&a…

Linux 进程管理与计划任务详解

Linux 进程管理与计划任务详解 一、程序与进程的基本概念 程序&#xff1a;保存在外部存储介质中的可执行机器代码和数据的静态集合&#xff0c;是静态的文件实体进程&#xff1a;在 CPU 及内存中处于动态执行状态的计算机程序&#xff0c;是程序的动态执行实例关联关系&#x…

分层解耦(Controller,Service,Dao)

1. 三层架构核心职责层级职责说明关键技术 / 注解Controller&#xff08;控制器&#xff09;1. 接收前端请求&#xff08;HTTP&#xff09; 2. 封装参数、校验 3. 调用 Service 处理业务 4. 返回视图 / 数据给前端Controller、GetMapping等Service&#xff08;业务层&#xff0…

镁金属接骨螺钉注册检测:骨科植入安全的科学基石

在骨科治疗领域&#xff0c;镁金属接骨螺钉凭借其可降解性与生物相容性&#xff0c;成为传统金属植入物的革新替代方案。然而&#xff0c;作为Ⅲ类高风险无源植入器械&#xff08;分类编码13-01-01&#xff09;&#xff0c;其注册检测需覆盖生物相容性、化学表征、降解性能、力…