饿汉式(Eager Initialization)和懒汉式(Lazy Initialization)是两种常见的单例设计模式的实现方式。
-
饿汉式:
- 在类加载时就创建实例对象,并且始终保持一个实例。
- 在类的静态变量中直接创建实例,并在静态代码块或者静态方法中进行初始化。
- 优点是线程安全,因为实例在类加载时就创建,不会存在多线程竞争的问题。
- 缺点是在应用程序启动时就创建实例,可能会造成资源的浪费,尤其是在实例较大或创建实例的过程较为耗时的情况下。
-
懒汉式:
- 在首次使用时才创建实例对象。
- 延迟初始化实例,一般在需要时通过判断实例是否为空来创建实例。
- 优点是节省了资源,在实例不被使用时不会进行初始化。
- 缺点是需要考虑线程安全性,在多线程环境下需要进行额外的同步控制,以避免多个线程同时创建实例的问题。
以下是简单的示例代码:
// 饿汉式
public class EagerSingleton {
private static final EagerSingleton instance = new EagerSingleton();
private EagerSingleton() {
// 私有化构造函数
}
public static EagerSingleton getInstance() {
return instance;
}
}
// 懒汉式
public class LazySingleton {
private static LazySingleton instance;
private LazySingleton() {
// 私有化构造函数
}
public static synchronized LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
在饿汉式中,实例在类加载时就创建,因此可以直接通过 EagerSingleton.getInstance() 获取实例。
在懒汉式中,实例在首次调用 LazySingleton.getInstance() 时创建。需要注意的是,为了保证线程安全,上述示例中的 getInstance() 方法使用了 synchronized 关键字进行同步控制。这种同步方式可以确保在多线程环境下只有一个线程能够创建实例,但在高并发环境下会存在性能问题。
需要根据具体的需求和场景选择适合的单例实现方式。如果实例的创建和初始化过程较为耗时,并且在应用程序启动时就需要使用该实例,可以考虑使用饿汉式。如果实例的创建比较轻量且在应用程序运行过程中可能不会被使用,可以考虑使用懒汉式。同时,在多线程环境下需要注意线程安全性。
博客介绍了单例设计模式的饿汉式和懒汉式实现方式。饿汉式在类加载时创建实例,线程安全但可能浪费资源;懒汉式在首次使用时创建实例,节省资源但需考虑线程安全。还给出示例代码,并建议根据具体需求和场景选择合适方式。
1135

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



