**Singleton设计模式** Singleton设计模式是软件工程中最常用的设计模式之一,它的主要目的是确保一个类只有一个实例,并提供全局访问点。在Java中,Singleton模式的实现有多种方式,每种方式都有其优缺点,我们将详细探讨这些实现方法并进行对比。 ### 1. 饿汉式(Static Final Field) 这是最简单的Singleton实现方式,通过静态初始化器在类加载时就创建了Singleton实例。 ```java public class Singleton { private static final Singleton INSTANCE = new Singleton(); private Singleton() {} public static Singleton getInstance() { return INSTANCE; } } ``` 优点:线程安全,因为类加载是线程安全的,所以Singleton实例的创建也是线程安全的。并且由于实例在类加载时就创建,所以不存在多线程下的性能问题。 缺点:Singleton实例在类加载时就被创建,即使可能永远都不会用到,造成了内存浪费。 ### 2. 懒汉式(Synchronized Method) 这种方式是在`getInstance()`方法上加`synchronized`关键字,保证了线程安全。 ```java public class Singleton { private static Singleton instance; private Singleton() {} public synchronized static Singleton getInstance() { if (instance == null) { instance = new Singleton(); } return instance; } } ``` 优点:延迟初始化,只有在调用`getInstance()`方法时才创建Singleton实例。 缺点:性能较低,每次调用`getInstance()`都需要进行同步,影响了并发效率。 ### 3. 双重检查锁定(Double-Check Locking) 这种方法结合了前两种方式的优点,既延迟初始化又避免了不必要的同步。 ```java public class Singleton { private volatile static Singleton instance; private Singleton() {} public static Singleton getInstance() { if (instance == null) { synchronized (Singleton.class) { if (instance == null) { instance = new Singleton(); } } } return instance; } } ``` 优点:线程安全,同时避免了不必要的同步,提高了并发性能。 缺点:代码相对复杂,需要理解volatile关键字的作用。 ### 4. 静态内部类 这种方式利用Java类加载机制保证单例的唯一性。 ```java public class Singleton { private Singleton() {} private static class SingletonInstance { private static final Singleton INSTANCE = new Singleton(); } public static Singleton getInstance() { return SingletonInstance.INSTANCE; } } ``` 优点:线程安全,延迟初始化,且不会因为线程同步带来性能影响。 缺点:对Singleton类的实现过程有所隐藏,不太符合开放封闭原则。 ### 5. 枚举 这是Joshua Bloch在《Effective Java》中推荐的方式。 ```java public enum Singleton { INSTANCE; public void whateverMethod() { // ... } } ``` 优点:简洁,线程安全,防止反射攻击,且JVM保证了枚举实例的唯一性。 缺点:如果Singleton需要持有外部引用,可能会导致内存泄漏。 Singleton模式的实现方式各有优劣,选择哪种方式取决于具体的应用场景和性能需求。在实际开发中,应根据项目需求选择最适合的Singleton实现方式。
- 1
- liyue0202014-06-18还是很不错的。推荐!
- 粉丝: 60
- 资源: 57
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助