网站首页的提交怎么做,做旅游网站怎么融资,舆情分析研判报告,陕西省建设厅执业资格注册中心网站报名系统单例模式 (Singleton Pattern) 是一种常见的设计模式#xff0c;属于创建型模式。它的核心思想是确保一个类只有一个实例#xff0c;并提供一个全局访问点来获取该实例。通常用于那些需要全局控制的场景#xff0c;比如配置管理、日志系统、数据库连接池等。
1. 单例模式的…单例模式 (Singleton Pattern) 是一种常见的设计模式属于创建型模式。它的核心思想是确保一个类只有一个实例并提供一个全局访问点来获取该实例。通常用于那些需要全局控制的场景比如配置管理、日志系统、数据库连接池等。
1. 单例模式的优点
全局访问点 提供了一个全局唯一的实例所有客户端都可以通过这个实例来访问相关功能。控制实例化次数 确保只有一个实例可以节省资源并且避免对象的重复创建。延迟实例化 只在需要时才创建实例避免不必要的内存开销。
2. 单例模式的实现方式
1) 懒汉式Lazy Initialization
懒汉式是在第一次调用 getInstance() 方法时才创建实例直到那时才初始化。为了保证线程安全我们通常使用 synchronized 来同步 getInstance 方法。
优点 延迟实例化减少不必要的资源浪费。
缺点 每次调用 getInstance() 时都要进行同步性能较差。
public class Singleton {private static Singleton instance;private Singleton() {}public static synchronized Singleton getInstance() {if (instance null) {instance new Singleton();}return instance;}
}2) 饿汉式Eager Initialization
饿汉式是在类加载时就创建实例这种方式不需要进行同步因此线程安全性较好。
优点 实现简单线程安全。
缺点 无论是否使用该实例类加载时就已经创建了对象这可能会导致资源浪费。
public class Singleton {private static final Singleton instance new Singleton();private Singleton() {}public static Singleton getInstance() {return instance;}
}3) 双重检查锁定Double-Checked Locking
为了提高性能可以在第一次检查时不加锁只有在实例为 null 时才加锁。加锁的操作只会发生一次从而避免每次调用时都进行同步。
优点 性能较好仅在第一次创建实例时加锁。
缺点 代码复杂且需要使用 volatile 关键字确保多线程情况下的正确性。
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;}
}4) 静态内部类Bill Pugh Singleton
这种方式利用了类加载的机制保证了线程安全并且实现了懒加载。它是单例模式的推荐实现方式。
优点 简洁、线程安全、懒加载性能优秀。
缺点 没有明显的缺点。
public class Singleton {private Singleton() {}private static class SingletonHolder {private static final Singleton INSTANCE new Singleton();}public static Singleton getInstance() {return SingletonHolder.INSTANCE;}
}5) 枚举式Enum Singleton
Java 提供的枚举类型本身就是单例的它可以保证线程安全、避免反序列化以及类加载机制的优势。
优点 线程安全、避免反射攻击、保证单例。
缺点 实现略显复杂但在现代 Java 开发中这通常是最推荐的单例实现方式。
public enum Singleton {INSTANCE;public void doSomething() {System.out.println(Doing something...);}
}使用时
Singleton.INSTANCE.doSomething();3. 何时使用单例模式
共享资源例如数据库连接池、线程池、配置管理等需要在整个应用中共享一个对象实例。全局控制需要在系统中保证唯一的控制对象例如日志系统。频繁创建销毁对象的场景例如复杂对象的创建、管理较为耗费资源可以使用单例来避免重复创建。
4. 注意事项
线程安全在多线程环境下需要确保实例化过程是线程安全的。反射和反序列化攻击单例类可以通过反射或反序列化破坏其唯一性枚举单例可以避免这种情况。性能问题使用懒汉式时如果没有做适当优化可能会在高并发情况下影响性能。
总结
单例模式是一种非常常见且有用的设计模式能够确保类只有一个实例并且提供全局访问点。在 Java 中推荐使用静态内部类单例模式和枚举单例模式这两种方式在性能、线程安全性和代码简洁性上都非常优秀。