推荐答案
在Java中,懒汉式和饿汉式是单例模式的两种实现方式,主要区别在于实例化的时机:
- 饿汉式:在类加载时就创建单例对象,线程安全,但可能会浪费资源。
- 懒汉式:在第一次使用时才创建单例对象,延迟加载,节省资源,但在多线程环境下需要额外的同步机制来保证线程安全。
本题详细解读
饿汉式实现
// www.javascriptcn.com code example
public class Singleton {
// 在类加载时就创建实例
private static final Singleton instance = new Singleton();
// 私有构造函数,防止外部实例化
private Singleton() {}
// 提供全局访问点
public static Singleton getInstance() {
return instance;
}
}特点:
- 实例在类加载时就已经创建,因此是线程安全的。
- 由于实例在类加载时就创建,可能会造成资源浪费,尤其是在实例化过程复杂或资源消耗较大的情况下。
懒汉式实现
// www.javascriptcn.com code example
public class Singleton {
// 延迟加载,初始为null
private static Singleton instance;
// 私有构造函数,防止外部实例化
private Singleton() {}
// 提供全局访问点,使用双重检查锁定保证线程安全
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}特点:
- 实例在第一次调用
getInstance()方法时才创建,实现了延迟加载,节省了资源。 - 由于延迟加载,在多线程环境下需要额外的同步机制(如双重检查锁定)来保证线程安全。
总结对比
| 特性 | 饿汉式 | 懒汉式 |
|---|---|---|
| 实例化时机 | 类加载时 | 第一次调用 getInstance() 时 |
| 线程安全性 | 线程安全 | 需要额外同步机制保证线程安全 |
| 资源利用 | 可能浪费资源 | 节省资源 |
| 实现复杂度 | 简单 | 较复杂(需要处理线程安全问题) |
通过以上对比,可以根据具体需求选择合适的单例模式实现方式。