单例模式是一种设计模式,确保一个类只有一个实例,并提供全局访问点。不同的单例实现方式在实现细节、线程安全、延迟初始化等方面有所不同。
以下是几种常见单例模式的对比:
1. 懒汉式(Lazy Initialization)
- 特点:实例在第一次使用时创建。
- 优点:节省资源,避免不必要的实例化。
- 缺点:线程不安全,多线程环境下可能创建多个实例。
- 代码示例:
public class Singleton { private static Singleton instance; private Singleton() {} public static 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)
- 特点:结合懒汉式和同步锁,减少同步开销。
- 优点:线程安全,延迟初始化,性能较好。
- 缺点:实现复杂,需注意
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. 静态内部类(Static Inner Class)
- 特点:利用类加载机制保证线程安全,延迟初始化。
- 优点:线程安全,延迟初始化,实现简单。
- 缺点:无法传递参数。
- 代码示例:
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)
- 特点:利用枚举特性实现单例。
- 优点:线程安全,防止反射攻击,实现简单。
- 缺点:不够灵活,无法延迟初始化。
- 代码示例:
public enum Singleton { INSTANCE; public void doSomething() { // 业务逻辑 } }
对比总结
| 实现方式 | 线程安全 | 延迟初始化 | 防止反射攻击 | 实现复杂度 |
|---|---|---|---|---|
| 懒汉式 | 不安全 | 是 | 否 | 简单 |
| 饿汉式 | 安全 | 否 | 否 | 简单 |
| 双重检查锁 | 安全 | 是 | 否 | 复杂 |
| 静态内部类 | 安全 | 是 | 否 | 简单 |
| 枚举 | 安全 | 否 | 是 | 简单 |
根据具体需求选择合适的实现方式,如对线程安全和延迟初始化有要求,双重检查锁或静态内部类是较好选择;若需防止反射攻击且不要求延迟初始化,枚举方式更为合适。
256

被折叠的 条评论
为什么被折叠?



