单例模式

张开发
2026/4/15 7:33:19 15 分钟阅读

分享文章

单例模式
定义单例模式Singleton Pattern是java最简单的设计模式之一用于保证某个类在运行期间只有一个实例对外提供服务我们称这种类型的类为单例类。设计原则1. 保证一个类只有一个实例2. 为实例提供一个全局访问点。实现方式饿汉式代码示例package com.sumlv.javase.note; /** * 单例示例 * * Auther: yuzhuo.song * Date: 2025-03-14 */ public class Singleton { private static Singleton instance new Singleton(); public static Singleton getInstance() { return instance; } /** * 用于避免序列化对单例的破坏 * 如果单例类没有实现序列化接口则不需要该方法 * * return 实例对象 */ private Object readResolve() { return instance; } /** * 用于避免反射对单例的破坏 */ private Singleton() { if (instance ! null) { throw new RuntimeException(illegal access); } } }补充说明1. 线程安全2. 不支持延时加载3. 获取实例对象速度较快4. 如果实例对象较大且一直未使用会造成内存浪费。懒汉式代码示例package com.sumlv.javase.note; /** * 单例示例 * * Auther: yuzhuo.song * Date: 2025-03-14 */ public class Singleton { private static Singleton instance; public static synchronized Singleton getInstance() { if (instance null) { instance new Singleton(); } return instance; } /** * 用于避免序列化对单例的破坏 * 如果单例类没有实现序列化接口则不需要该方法 * * return 实例对象 */ private Object readResolve() { return instance; } /** * 用于避免反射对单例的破坏 */ private Singleton() { if (instance ! null) { throw new RuntimeException(illegal access); } } }补充说明1. 支持延迟加载2. 保证多线程模式下实例的唯一性3. 并发度低在频繁调用时会产生性能瓶颈。双重检查锁代码示例package com.sumlv.javase.note; /** * 单例示例 * * Auther: yuzhuo.song * Date: 2025-03-14 */ public class Singleton { private static volatile Singleton instance; public static Singleton getInstance() { if (instance null) { synchronized (Singleton.class) { if (instance null) { instance new Singleton(); } } } return instance; } /** * 用于避免序列化对单例的破坏 * 如果单例类没有实现序列化接口则不需要该方法 * * return 实例对象 */ private Object readResolve() { return instance; } /** * 用于避免反射对单例的破坏 */ private Singleton() { if (instance ! null) { throw new RuntimeException(illegal access); } } }补充说明1. 支持延迟加载2. 并发度高在频繁调用时不会产生性能瓶颈。静态内部类代码示例package com.sumlv.javase.note; /** * 单例示例 * * Auther: yuzhuo.song * Date: 2025-03-14 */ public class Singleton { public static Singleton getInstance() { return InnerClass.instance; } /** * 用于避免序列化对单例的破坏 * 如果单例类没有实现序列化接口则不需要该方法 * * return 实例对象 */ private Object readResolve() { return InnerClass.instance; } /** * 用于避免反射对单例的破坏 */ private Singleton() { if (InnerClass.instance ! null) { throw new RuntimeException(illegal access); } } private static class InnerClass { private static Singleton instance new Singleton(); } }补充说明1. 支持延迟加载2. 并发度高在频繁调用时不会产生性能瓶颈。3. 实现方式相较于双重检查锁更为简洁。枚举代码示例package com.sumlv.javase.note; /** * 单例示例 * * Auther: yuzhuo.song * Date: 2025-03-14 */ public enum Singleton { INSTANCE; public static Singleton getInstance() { return INSTANCE; } }补充说明1. 最简单的单例实现方式2. 线程安全3. 无需关心反射和序列化对单例造成破坏

更多文章