spring设计模式-单例模式
单例模式是指确保一个类在任何情况下都绝对只有一个实例并提供一个全局访问点。单例模式是创建型模式懒汉式单例模式在类加载的时候就立即初始化并且创建为单例对象它绝对线程安全线程还没出现的时候就实例化了不可能存在访问安全问题。优点没有加任何锁执行效率比较高用户体验比懒汉式单例模式更好缺点类加载的时候就初始化不管用不用都占着空间浪费了内存。饿汉式 public class HungrySingleton { private static HungrySingleton hungrySingletonnew HungrySingleton(); //另一种写法 private static HungrySingleton hungrySingleton1; static{ hungrySingleton1new HungrySingleton(); } private HungrySingleton(){} public static HungrySingleton getInstance(){ return hungrySingleton; } } 懒汉式 /** * 特点被外部类调用的时候内部类才会被加载.缺点线程不安全 */ public class LazySingleton { private LazySingleton(){} private static LazySingleton lazySingletonnull; public static LazySingleton getInstance(){ if (lazySingletonnull){ lazySingletonnew LazySingleton(); } return lazySingleton; } //方法一线程不安全的办法加锁,缺点性能下降 public static synchronized LazySingleton getInstance1(){ if (lazySingletonnull){ lazySingletonnew LazySingleton(); } return lazySingleton; } //方法二双重检验所解决线程安全和性能问题(双重检验锁 public static LazySingleton getInstance2(){ if(lazySingletonnull){ synchronized (LazySingleton.class){ if(lazySingletonnull){ lazySingletonnew LazySingleton(); //1、分配内存给这个对象 //2、初始化对象 //3、设置lazysingleton指向刚分配的内存地址 } } } return lazySingleton; } } 内部类 package com.wanda.singleton; import java.lang.reflect.Constructor; /** * 这种形式兼顾了饿汉式内存浪费问题和synchronized性能问题 */ public class LazyInnerSingleton { // private LazyInnerSingleton(){} //修改后的构造方法 private LazyInnerSingleton(){ if(LazyHolder.lazy!null){ throw new RuntimeException(不允许创建多个实例); } } public static final LazyInnerSingleton getInstance(){ return LazyHolder.lazy; } //内部类在方法调用之前初始化避免了线程不安全的问题 private static class LazyHolder{ private static final LazyInnerSingleton lazynew LazyInnerSingleton(); } public static void main(String[] args) { //反射破坏单例情况,通过这种方式会创建两个不同的单例。可以在构造方法中做一些限制一旦多次重复创建就抛出异常。 try { Class? clazzLazyInnerSingleton.class; Constructor constructorclazz.getDeclaredConstructor(null); //强制访问 constructor.setAccessible(true); Object o1constructor.newInstance(); Object o2constructor.newInstance(); System.out.println(o1o2); }catch (Exception e){ e.printStackTrace(); } } } 序列化破坏单例 package com.wanda.singleton; import java.io.*; //一个单例对象创建后有时需要序列化到磁盘下次使用时在从磁盘读入进行反序列化反序列华的对象会重新分配内存 //即重新创建如果序列化的对象是单例就违背了单例的意义。 public class SeriableSingleton implements Serializable { public static final SeriableSingleton INSTANCEnew SeriableSingleton(); private SeriableSingleton(){} public static SeriableSingleton getInstance(){ return INSTANCE; } private Object readResolve(){ return INSTANCE; } public static void main(String[] args) { SeriableSingleton s1null; SeriableSingleton s2SeriableSingleton.getInstance(); FileOutputStream fosnull; try { fosnew FileOutputStream(seriablesingleton.obj); ObjectOutputStream osnew ObjectOutputStream(fos); os.writeObject(s2); os.flush(); os.close(); FileInputStream fisnew FileInputStream(seriablesingleton.obj); ObjectInputStream oisnew ObjectInputStream(fis); s1(SeriableSingleton) ois.readObject(); ois.close(); System.out.println(s1); System.out.println(s2); System.out.println(s1s2);//false 解决方法加上readResolve方法 }catch (Exception e){ } } } 枚举 package com.wanda.singleton; import java.io.*; //一个单例对象创建后有时需要序列化到磁盘下次使用时在从磁盘读入进行反序列化反序列华的对象会重新分配内存 //即重新创建如果序列化的对象是单例就违背了单例的意义。 public class SeriableSingleton implements Serializable { public static final SeriableSingleton INSTANCEnew SeriableSingleton(); private SeriableSingleton(){} public static SeriableSingleton getInstance(){ return INSTANCE; } private Object readResolve(){ return INSTANCE; } public static void main(String[] args) { SeriableSingleton s1null; SeriableSingleton s2SeriableSingleton.getInstance(); FileOutputStream fosnull; try { fosnew FileOutputStream(seriablesingleton.obj); ObjectOutputStream osnew ObjectOutputStream(fos); os.writeObject(s2); os.flush(); os.close(); FileInputStream fisnew FileInputStream(seriablesingleton.obj); ObjectInputStream oisnew ObjectInputStream(fis); s1(SeriableSingleton) ois.readObject(); ois.close(); System.out.println(s1); System.out.println(s2); System.out.println(s1s2);//false 解决方法加上readResolve方法 }catch (Exception e){ } } } 容器式 package com.wanda.singleton; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; /** * 容器式单例模式:非线程安全 */ public class ContainerSingleton { private ContainerSingleton(){} private static MapString,Object mapnew ConcurrentHashMap(); public static Object getBean(String clazzName){ synchronized (map){ if(!map.containsKey(clazzName)){ Object objnull; try{ objClass.forName(clazzName).newInstance(); map.put(clazzName,obj); }catch (Exception e){ e.printStackTrace(); } return obj; }else{ return map.get(clazzName); } } } }

相关新闻

5分钟掌握OBS多平台直播推流:obs-multi-rtmp插件完整配置指南

5分钟掌握OBS多平台直播推流:obs-multi-rtmp插件完整配置指南

5分钟掌握OBS多平台直播推流:obs-multi-rtmp插件完整配置指南 【免费下载链接】obs-multi-rtmp OBS複数サイト同時配信プラグイン 项目地址: https://gitcode.com/gh_mirrors/ob/obs-multi-rtmp 你是否曾为多平台直播而烦恼?想要同时在YouTube、B…

2026/7/28 15:21:31 阅读更多 →
基于行空板与OpenCV的人脸跟随系统:从硬件搭建到PID控制实战

基于行空板与OpenCV的人脸跟随系统:从硬件搭建到PID控制实战

1. 项目概述:当行空板“看见”你 最近在捣鼓一个挺有意思的小项目:让一块行空板加上摄像头,再配上舵机云台,实现一个能自动跟着人脸转动的“人脸跟随”系统。听起来是不是有点科幻电影里自动炮塔的感觉?当然&#xff0…

2026/7/28 15:20:31 阅读更多 →
Magpie窗口缩放工具:Windows屏幕放大的完整解决方案

Magpie窗口缩放工具:Windows屏幕放大的完整解决方案

Magpie窗口缩放工具:Windows屏幕放大的完整解决方案 【免费下载链接】Magpie A general-purpose window upscaler for Windows 10/11. 项目地址: https://gitcode.com/gh_mirrors/mag/Magpie Magpie是一款专为Windows 10/11设计的通用窗口缩放工具&#xff0…

2026/7/28 15:20:31 阅读更多 →

最新新闻

2026年香精香料行业PLM系统盘点:主流产品助调香与合规提效

2026年香精香料行业PLM系统盘点:主流产品助调香与合规提效

一、产业迭代提速:2026香精香料行业数字化现状与痛点1.1 行业数字化发展现状2026年上半年,国内香精香料行业依托生物合成、AI调香技术加速转型升级,向精细化、合规化方向发展。据中研产业研究院半年报数据,行业市场规模同比增长6.…

2026/7/28 15:28:35 阅读更多 →
低代码开发如何提升后端配置效率与实战技巧

低代码开发如何提升后端配置效率与实战技巧

1. 低代码开发如何让后端配置变得高效 早上十点半,同事看我悠闲地喝着咖啡,以为我又在摸鱼。殊不知,我已经用JNPF低代码平台完成了三个后端模块的配置。这种误解在传统开发模式下很常见——非技术人员往往看不到后台的代码逻辑,而…

2026/7/28 15:28:35 阅读更多 →
C#观察者模式:事件驱动编程的三种实现方式

C#观察者模式:事件驱动编程的三种实现方式

1. 观察者模式:像订阅杂志一样理解事件驱动 第一次听说观察者模式时,我的反应和大多数新手一样困惑——这到底是个什么魔法?直到某天在咖啡厅看到一位顾客订阅杂志的过程,突然茅塞顿开。想象你走进报刊亭,对老板说&…

2026/7/28 15:28:35 阅读更多 →
【计算机JAVA毕业设计案例】面向高校的共享单车租赁服务管控平台 基于SpringBoot+Vue的校园单车用户租车记录与数据统计分析系统(程序+文档+讲解+定制)

【计算机JAVA毕业设计案例】面向高校的共享单车租赁服务管控平台 基于SpringBoot+Vue的校园单车用户租车记录与数据统计分析系统(程序+文档+讲解+定制)

博主介绍:✌️码农一枚 ,专注于大学生项目实战开发、讲解和毕业🚢文撰写修改等。全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围:&am…

2026/7/28 15:28:35 阅读更多 →
利用HashSet去除重复元素

利用HashSet去除重复元素

练习1:利用HashSet去除重复元素 使用Scanner从键盘读取一行输入,去掉其中重复字符,打印出不同的那些字符 aaaabbbbccccdddd* 分析:* 1.创建Scanner对象* 2.创建HashSet对象,将字符存储,去掉重复* 3.将字符串转换为字符数组,获取每一个字符存储在HashSet集合中,自动去…

2026/7/28 15:28:34 阅读更多 →
信息系统项目管理师论文写作:质量管理模块高分指南

信息系统项目管理师论文写作:质量管理模块高分指南

1. 信息系统项目管理师论文写作要点解析从事IT项目管理十余年,我辅导过上百位学员准备信息系统项目管理师论文考试。质量管理作为九大知识领域中最常考的模块之一,其论文写作需要把握三个核心维度:理论框架的完整性、实践案例的真实性和改进措…

2026/7/28 15:27:34 阅读更多 →

日新闻

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生

告别臃肿!3步让你的暗影精灵笔记本重获新生 【免费下载链接】OmenSuperHub Control Omen laptop performance, fan speeds, and keyboard lighting, and unlock power limits. 项目地址: https://gitcode.com/gh_mirrors/om/OmenSuperHub 你是否也曾为官方Om…

2026/7/28 0:00:43 阅读更多 →
RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

RAG必踩坑!财报法规检索不准?这款开源工具让答案浮出水面,准确率飙升98.7%!

做 RAG 的人应该都踩过这个致命的坑:把几百页的财报、法规、技术手册扔给向量库,问一个具体问题,搜出来的全是沾边但没用的内容 —— 关键信息要么被硬切块拆碎了,要么藏在几十条结果的最下面。语义相似≠真正相关,这个…

2026/7/28 0:00:43 阅读更多 →
抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

抖音视频文案提取工具全指南:免费2026版、手机App、在线工具一网打尽

2026年做短视频运营,从抖音上扒文案早就不是偷偷抄笔记的事了。我刚开始做内容的时候,每天刷半小时抖音,手动把爆款视频的口播敲进备忘录,一条2分钟的视频得花十来分钟,碰到语速快的还要反复回听。后来试了一圈工具&am…

2026/7/28 0:00:43 阅读更多 →

周新闻

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 道路桥梁裂缝检测数据集 道路桥梁病害识别检测数据集

深度学习道路桥梁裂缝检测系统 数据集6000张 完整源码已标注数据集训练好的模型环境配置教程程序运行说明文档,可以直接使用!系统支持图片、视频、摄像头等多种方式检测裂缝,功能强大实用。 1数据集6000张 8各类别

2026/7/28 12:04:22 阅读更多 →
深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

深度学习YOLO模型如何训练 PUBG 绝地求生目标检测数据集

pubg数据集 精选原图1.42万数据 1.49万标签 无任何重复、算法增强或冗余图像! pubg绝地求生目标检测数据集 1分类:e_body,14905个标签,txt格式 共计14244张图,99%为640*640尺寸图像 适合yolo目标检测、AI训练关键词&am…

2026/7/28 8:29:16 阅读更多 →
Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex英雄目标检测数据集 深度学习框架YOLO如何训练APEX数据集

Apex检测数据集数据集详情检测类别: allies enemy tag图片总量:7247张训练集:5139张验证集:1425张测试集:683张标注状态:全部已标注,即拿即用数据格式:支持YOLO格式及其他格式&#…

2026/7/28 5:03:42 阅读更多 →

月新闻