JAVA 设计模式 之 单列模式
1.什么是单列模式
说简单点就是确保某个类只有一个实例,而且自行实例化并向整个系统提供这个实例
比如:线程池、日志对象 这些都是被设计成单列
2.单列模式的特点
-有且只有一个实例
-必须自己创建自己唯一的实例
-必须给其他所有的对象提供这一实例
-单列模式保证全局对象的唯一性
3.线程安全问题
在使用单例对象的时候,要注意单例对象内的实例变量是会被多线程共享的,推荐使用无状态的对象,
不会因为多个线程的交替调度而破坏自身状态导致线程安全问题,
比如我们常用的VO,DTO等(局部变量是在用户栈中的,而且用户栈本身就是线程私有的内存区域,所以不存在线程安全问题)。
4.实现单列的方式
1.饿汉式单列(立即加载)
1 2 3 4 5 6 7 8 9 10 11 12 | // 饿汉式单例 public class Singleton1 { // 私有构造 private Singleton1() {} private static Singleton1 single = new Singleton1(); // 静态工厂方法 public static Singleton1 getInstance() { return single; } } |
饿汉式单例在类加载初始化时就创建好一个静态的对象供外部使用,除非系统重启,这个对象不会改变,所以本身就是线程安全的。
Singleton通过将构造方法限定为private避免了类在外部被实例化,在同一个虚拟机范围内,Singleton的唯一实例只能通过getInstance()方法访问。
事实上,通过Java反射机制是能够实例化构造方法为private的类的,那基本上会使所有的Java单例实现失效。此问题在此处不做讨论,姑且闭着眼就认为反射机制不存在。)
2.懒汉式单列(延迟加载)
// 懒汉式单例 public class Singleton2 { // 私有构造 private Singleton2() {} private static Singleton2 single = null; public static Singleton2 getInstance() { if(single == null){ single = new Singleton2(); } return single; } }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)