Java模式设计之单例模式[借鉴].pdf
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
单例模式是设计模式中的一种,它用于控制类的实例化过程,确保一个类在整个程序运行期间只有一个实例存在。这种模式常用于资源管理,比如管理打印机、通信端口或者系统配置等,因为这些资源通常需要全局共享且初始化成本较高。 在Java中,实现单例模式主要有两种方式:饿汉式和懒汉式。 **饿汉式单例**: 饿汉式单例类在类加载时就完成了初始化,直接创建了单例实例。这种方式保证了线程安全,但可能造成资源浪费,因为无论是否使用,都会在类加载时创建对象。代码如下: ```java public class EagerSingleton { private static final EagerSingleton INSTANCE = new EagerSingleton(); private EagerSingleton() {} public static EagerSingleton getInstance() { return INSTANCE; } } ``` **懒汉式单例**: 懒汉式单例在类首次被调用时才初始化实例,延迟了对象的创建,更加符合“按需创建”的原则。但在多线程环境下,如果不采取同步措施,可能会创建多个实例。简单的懒汉式单例如下: ```java public class LazySingleton { private static LazySingleton INSTANCE = null; private LazySingleton() {} public static synchronized LazySingleton getInstance() { if (INSTANCE == null) { INSTANCE = new LazySingleton(); } return INSTANCE; } } ``` 这里的同步关键字`synchronized`确保了线程安全,但会降低性能,因为每次调用`getInstance()`都会进行同步。 **双重检查锁定(DCL,Double-Checked Locking)**: 为了解决懒汉式的性能问题,有人提出了双重检查锁定,试图在保证线程安全的同时减少同步开销。然而在Java中,早期的DCL实现并不完全正确,因为Java内存模型的细节可能导致非线程安全。正确的DCL实现需要使用volatile关键字: ```java public class DoubleCheckSingleton { private volatile static DoubleCheckSingleton instance; private DoubleCheckSingleton() {} public static DoubleCheckSingleton getInstance() { if (instance == null) { synchronized (DoubleCheckSingleton.class) { if (instance == null) { instance = new DoubleCheckSingleton(); } } } return instance; } } ``` 这里的`volatile`关键字确保了多线程环境下的可见性和有序性,保证了实例的正确初始化。 除了上述实现,还有其他变种,如枚举单例、静态内部类单例等,它们都能在保证单例的同时,解决线程安全问题。 单例模式通过限制类的实例化次数,确保全局只有一个实例,从而达到资源管理的目的。在Java中,实现单例需要注意线程安全和性能的平衡,选择适合场景的实现方式。
- 粉丝: 3
- 资源: 11万+
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助