当前位置: 首页 > wzjs >正文

定位网站关键词大连网站开发培训

定位网站关键词,大连网站开发培训,山东住房和城乡建设厅网站教育中心,wordpress footer设置作为一名Java开发工程师,你一定对**单例模式(Singleton Pattern)**不陌生。它是23种经典设计模式中最简单也是最常用的一种,用于确保一个类在整个应用程序中只有一个实例存在。单例广泛应用于系统配置、数据库连接池、日志管理器、…

作为一名Java开发工程师,你一定对**单例模式(Singleton Pattern)**不陌生。它是23种经典设计模式中最简单也是最常用的一种,用于确保一个类在整个应用程序中只有一个实例存在。

单例广泛应用于系统配置、数据库连接池、日志管理器、缓存服务等场景。本文将带你全面掌握 Java中实现单例的多种方式、线程安全性、懒加载机制、反射攻击防范、序列化处理以及在Spring中的应用


🧱 一、什么是单例模式?

单例模式(Singleton Pattern) 是一种创建型设计模式,其核心思想是:

✅ 确保一个类在整个程序运行期间只被初始化一次,并提供一个全局访问点。

单例的核心特点:

特性描述
私有构造方法防止外部通过 new 创建实例
静态私有实例指向自己唯一的实例对象
公共静态获取方法提供对外访问该实例的方法

📦 二、单例的基本实现方式

1. 饿汉式(Eager Initialization)

public class Singleton {// 类加载时就初始化private static final Singleton INSTANCE = new Singleton();// 构造方法私有private Singleton() {}// 提供唯一访问方法public static Singleton getInstance() {return INSTANCE;}
}

✅ 线程安全
⚠️ 类加载即初始化,浪费资源(非懒加载)


2. 懒汉式(Lazy Initialization)

public class Singleton {private static Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

⚠️ 非线程安全,在多线程下可能创建多个实例


3. 懒汉式 + 同步方法(线程安全)

public class Singleton {private static Singleton instance;private Singleton() {}public synchronized static Singleton getInstance() {if (instance == null) {instance = new Singleton();}return instance;}
}

✅ 线程安全
⚠️ 性能差,每次调用都要加锁


4. 双重检查锁定(Double-Checked Lockin

public class Singleton {private static volatile Singleton instance;private Singleton() {}public static Singleton getInstance() {if (instance == null) {synchronized (Singleton.class) {if (instance == null) {instance = new Singleton();}}}return instance;}
}

✅ 线程安全、懒加载、性能较好
✅ 必须使用 volatile 防止指令重排序


5. 静态内部类(IoDH,Initialization on Demand Holder)

public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE = new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}

✅ 线程安全
✅ 懒加载
✅ 推荐写法之一


6. 枚举(Enum)实现单例(《Effective Java》推荐)

public enum Singleton {INSTANCE;public void doSomething() {System.out.println("执行单例操作");}
}

调用方式:

Singleton.INSTANCE.doSomething();

✅ 线程安全
✅ 天然支持序列化/反序列化
✅ 防止反射攻击
✅ 推荐写法之一


🔐 三、单例的安全性问题

1. 如何防止反射破坏单例?

默认情况下,通过反射可以调用私有构造函数,从而创建多个实例。

解决办法:添加构造函数检测

private Singleton() {if (INSTANCE != null) {throw new RuntimeException("单例已被初始化");}
}

2. 如何防止序列化/反序列化破坏单例?

如果实现了 Serializable 接口,反序列化会生成新对象。

解决办法:添加 readResolve() 方法

protected Object readResolve() {return INSTANCE;
}

🔄 四、单例模式的应用场景

场景示例
日志记录器记录整个系统的日志
数据库连接池统一管理数据库连接
缓存服务如本地缓存、Redis客户端
配置管理器加载并读取配置文件
Spring Bean默认就是单例作用域
线程池统一管理线程资源
ID生成器保证ID全局唯一

🧩 五、单例模式的优缺点

优点缺点
节省内存资源生命周期长,可能造成内存泄漏
提供全局访问点违背单一职责原则(若逻辑复杂)
易于维护和控制不利于测试(依赖隐藏)
线程安全(部分实现)扩展困难(不符合开闭原则)

📦 六、Spring 中的单例 Bean

在Spring框架中,默认所有Bean都是单例的(@Scope("singleton")),但它的“单例”含义略有不同:

✅ 在Spring容器中,每个Bean定义只会有一个实例
❗ 与传统单例不同的是,它不是JVM级别的单例,而是Spring上下文内的单例

示例

@Component
public class MyService {public void sayHello() {System.out.println("Hello from singleton bean");}
}

注入使用:

@RestController
public class MyController {@Autowiredprivate MyService myService;@GetMapping("/hello")public String hello() {myService.sayHello();return "OK";}
}

🚫 七、常见误区与注意事项

错误正确做法
使用懒汉式未同步导致并发问题使用双重检查或静态内部类
忘记 volatile 导致指令重排添加 volatile 关键字
忽略反射攻击添加构造函数检查
忽略序列化破坏添加 readResolve() 方法
将单例用于可变状态应保持不可变性或加锁处理
单例中包含大量业务逻辑应拆分职责,避免违反单一职责原则

📊 八、六种常见单例实现对比表

实现方式是否线程安全是否懒加载是否推荐
饿汉式
懒汉式
同步方法懒汉式
双重检查锁定
静态内部类
枚举✅✅✅(最佳实践)

📎 九、附录:单例相关工具与框架速查表

工具/框架用途
Lombok 的 @UtilityClass帮助构建无实例的工具类
Spring 的 @Component / @Service自动注册为单例Bean
Guice / DaggerDI框架中的单例支持
MapStruct / Dozer单例工具类转换数据
Jackson / Gson单例对象的序列化控制
Mockito单例测试时需使用 Spy 或注入方式
ThreadLocal若误用可能导致伪单例问题
Flyweight 模式与单例类似,但允许多个共享实例

✅ 十、总结:Java 单例类关键知识点一览表

内容说明
定义整个程序中仅允许存在一个实例
核心结构私有构造器 + 私有静态实例 + 公共静态访问方法
实现方式饿汉式、懒汉式、双重检查、静态内部类、枚举
线程安全枚举、双重检查、静态内部类是线程安全的
懒加载懒汉式、双重检查、静态内部类支持懒加载
Spring 中的单例容器内单例,非JVM级别
注意事项防止反射、序列化破坏,合理使用
推荐写法枚举 > 静态内部类 > 双重检查

如果你正在准备一篇面向初学者的技术博客,或者希望系统回顾Java基础知识,这篇文章将为你提供完整的知识体系和实用的编程技巧。

欢迎点赞、收藏、转发,也欢迎留言交流你在实际项目中遇到的单例类相关问题。我们下期再见 👋

📌 关注我,获取更多Java核心技术深度解析!


文章转载自:

http://afrJ5dFZ.wqfrd.cn
http://EY7WqVbY.wqfrd.cn
http://gHFKHsoL.wqfrd.cn
http://NaY8PhHE.wqfrd.cn
http://vKpGlRkW.wqfrd.cn
http://8PQorTe9.wqfrd.cn
http://siWY65v6.wqfrd.cn
http://cP5kVp7b.wqfrd.cn
http://bJ5k8bMD.wqfrd.cn
http://FXVDxu7D.wqfrd.cn
http://8NB5iUvB.wqfrd.cn
http://vkfwa9Mr.wqfrd.cn
http://iuq1A87u.wqfrd.cn
http://hFfNp8o9.wqfrd.cn
http://mxdGlfnw.wqfrd.cn
http://psgnaCnj.wqfrd.cn
http://B2TzcFqB.wqfrd.cn
http://QdAlLpqk.wqfrd.cn
http://TPDG7Owk.wqfrd.cn
http://rGYvQztV.wqfrd.cn
http://KOmie3wC.wqfrd.cn
http://IdLijvEe.wqfrd.cn
http://IshNFNDy.wqfrd.cn
http://jMbllx4Y.wqfrd.cn
http://2Uhwb5X4.wqfrd.cn
http://1qpWw5nU.wqfrd.cn
http://2l84gEwn.wqfrd.cn
http://2j5T1Hr7.wqfrd.cn
http://jaUGOU6w.wqfrd.cn
http://bGEmVe5v.wqfrd.cn
http://www.dtcms.com/wzjs/628112.html

相关文章:

  • 麻栗坡网站建设网站建设项目可行性
  • 商城网站建设运营合同书宁波做网站gs
  • 安徽宿州住房与建设网站广告设计公司朋友圈第一条怎么发
  • 网站建设服务费怎么记账网站的创新点有哪些
  • 网站漏洞以及找后台入口 等功能.做有后台的网站
  • 企业网站的功能模块重庆企业vi设计公司
  • 东莞 网站建设多少钱整站快速排名优化
  • jsp电商网站怎么做搭建网站服务
  • 阿里云如何建设网站wordpress 当前主题目录
  • 带后台的php网站模板wordpress4.9.4下载
  • 利用业务时间做的网站与公司有关吗珠海移动网站建设公司排名
  • 兰州做门户网站现代网络营销的方式
  • 怎么网站是谁做的企微宝
  • 网站设计有限公司怎么样工商营业执照怎么网上年审
  • 外贸必看网站成立网站建设工作领导小组
  • 做网站为什么可以自学广西壮族自治区皮肤病医院
  • 做微网站 主机 域名广告设计制作图片
  • 深圳哪个招聘网站好手机怎么安装 wordpress
  • 皮卡剧网站怎样做深圳市响应式网站建设
  • 网站的手机版m站怎么做网站关键词密度查询
  • 网站怎么添加代码北京游戏软件开发公司
  • 网站建设属于广告费么专题页是什么
  • 佛山网站建设公司做wish选品参考什么网站
  • 东昌府做网站推广济南58同城网
  • 做商城网站需要什么条件北京高端品牌网站定制
  • 国际网站开发百度推广建站平台
  • 谁做的四虎网站是多少钱天河网站建设设计
  • 建造网站 备案网页设计实验报告结果分析
  • 阜阳做网站的网络公司公众号免费素材网站
  • 深圳建站科技有限公司专业设计企业网站