Java单例模式详解:饿汉式、懒汉式与枚举式

版权申诉
5星 · 超过95%的资源 4 下载量 177 浏览量 更新于2024-09-11 收藏 108KB PDF 举报
本文主要探讨了Java中实现单例模式的三种常见方法:饿汉式、懒汉式和枚举式。这些模式是设计模式中经典的部分,对于理解和创建高效、线程安全的单例实例具有重要意义。 **1. 饿汉式(Eager Singleton)** 饿汉式单例模式在类加载时就预先创建了单例对象,确保无论何时请求,都能立即得到一个已存在的实例。这种方式线程安全,因为对象在类加载时就创建了,无需同步。但缺点是如果应用程序在启动时不需要这个单例,可能会造成资源浪费。以下是饿汉式的一个例子: ```java public class SingletonHanger { private static final SingletonHanger instance = new SingletonHanger(); // 构造函数私有化,防止外部实例化 private SingletonHanger() {} public static SingletonHanger getInstance() { return instance; } } ``` **2. 懒汉式(Lazy Singleton)** 懒汉式是在真正需要单例时才创建对象,这样可以避免早期加载可能导致的资源消耗。有两种常见的实现方式:无锁懒汉式和双重检查锁定懒汉式。无锁懒汉式不安全,因为它可能在多线程环境下创建多个实例。而双重检查锁定(DCL)确保了线程安全,但有特定的JVM底层限制。这里以双重检查锁定为例: ```java public class SingletonLazy { private volatile static SingletonLazy instance; private SingletonLazy() {} public static SingletonLazy getInstance() { if (instance == null) { synchronized (SingletonLazy.class) { if (instance == null) { instance = new SingletonLazy(); } } } return instance; } } ``` **3. 枚举单例(Enum Singleton)** 枚举单例是Java提供的内置方式,既简单又保证线程安全,且调用效率高。每个枚举都有一个独一无二的实例,且不能被实例化。这是唯一一种可以在编译时保证只有一个实例的单例模式: ```java public enum SingletonByEnum { INSTANCE; // 枚举成员方法,提供公共接口 public void doSomething() { // ... } } ``` 总结来说,选择哪种单例模式取决于应用场景和需求。饿汉式适合对资源占用敏感且无需延迟加载的情况;懒汉式适用于延迟加载或资源成本较高的场景,需要注意线程安全;而枚举单例则提供了一种简洁且高效的方式,尤其适用于那些只希望有一个实例并且没有额外复杂性的场景。在实际开发中,根据项目需求权衡各种模式的利弊是至关重要的。