Java单例模式详解:饿汉子、懒汉子与注册式

5星 · 超过95%的资源 需积分: 14 9 下载量 83 浏览量 更新于2024-09-16 1 收藏 21KB DOCX 举报
"Java单例类的实现方式包括饿汉子式、懒汉子式和注册式。饿汉子式在类加载时就创建实例,保证线程安全但不延迟初始化。懒汉子式在第一次调用getInstance()时创建实例,通过synchronized关键字确保线程安全,但可能造成不必要的同步开销。注册式单例结合了两者,允许子类化并以懒初始化方式创建实例,通过一个静态注册表来管理各个实例。" 在Java中,单例模式是一种常用的设计模式,它确保一个类只有一个实例,并提供全局访问点。单例模式在很多场景下非常有用,例如控制资源的共享、创建昂贵的对象或者管理系统级别的服务。 1. **饿汉子式单例** (Eager Initialization): 饿汉子式单例在类加载时就完成了实例化,所以它是线程安全的。这种方式的优点是初始化时就创建了单例,避免了多次实例化的可能性。但是,如果单例类不经常使用,那么这种提前创建可能会浪费资源。 ```java public class HungrySingle { private static final HungrySingle hungry = new HungrySingle(); private HungrySingle() {} public static HungrySingle getInstance() { return hungry; } } ``` 2. **懒汉子式单例** (Lazy Initialization): 懒汉子式单例在首次调用`getInstance()`方法时才创建实例,这延迟了初始化,提高了效率。但是,如果不使用synchronized关键字,可能会导致多个线程同时创建单例实例,因此通常会使用`synchronized`修饰`getInstance()`方法来确保线程安全。然而,这种方法每次调用`getInstance()`都需要同步,可能会降低性能。 ```java public class LazySingle { private static LazySingle lazy = null; private LazySingle() {} public synchronized static LazySingle getInstance() { if (lazy == null) { lazy = new LazySingle(); } return lazy; } } ``` 3. **登记式单例** (Registry Singleton, 又称静态工厂或双检锁/双重校验锁单例): 登记式单例是饿汉子式和懒汉子式的结合,它通过一个静态注册表来保存单例实例,允许子类化并且仍然保持线程安全。这种方式在多线程环境中更高效,因为只有第一次实例化时才需要同步。子类可以通过继承并重写注册方法来实现延迟初始化。 ```java public class RegistrationSingle { private static HashMap<String, RegistrationSingle> regist = new HashMap<>(); private RegistrationSingle() {} public static RegistrationSingle getInstance(String key) { // 实现根据key获取或创建实例的逻辑 } } ``` 选择哪种单例模式取决于具体需求,如是否需要延迟初始化、是否考虑多线程环境、是否允许子类化等。在实际开发中,通常会优先考虑懒汉子式单例,但在性能敏感的情况下,可能会采用登记式单例来平衡性能和线程安全性。