java + 单例模式 + 懒汉式 + 资源
需积分: 0 21 浏览量
更新于2022-12-21
收藏 537KB DOCX 举报
本文档比较清晰明了地介绍了懒汉式以及懒汉式(我要对象的时候才给我创建)和饿汉式(我不要对象的时候你也给我创建)的区别;懒汉式只有你调用返回对象的方法时才调用对象,饿汉式是在类加载的时候就创建了对象;懒汉式存在线程安全的问题,而饿汉式存在资源空间浪费的问题;二者调用一次对象后,无论后面调用多少次对象,它都会返回第一个创建的对象,保证单例的实现。
Java 单例模式是设计模式中的一种,它的主要目的是确保一个类只有一个实例,并提供一个全局访问点。在Java中,单例模式有多种实现方式,其中最常用的两种是饿汉式(Eager Initialization)和懒汉式(Lazy Initialization)。本文将深入探讨懒汉式单例模式,以及它与饿汉式的区别。
### 懒汉式单例模式
懒汉式的核心思想是“延迟初始化”,即在对象真正被需要时才进行创建。这样可以避免在类加载时就占用不必要的资源,只有当调用获取对象的方法时,才会去创建单例对象。以下是懒汉式的实现步骤:
1. **构造器私有化**:这是所有单例模式的基础,通过将构造器设为私有,防止外部直接通过new关键字创建实例。
2. **在类的内部创建静态对象**:这个静态对象是单例类的唯一实例,通常为private修饰,以防止外部访问。
3. **提供一个public的static方法**:该方法负责返回单例对象,通常是通过检查实例是否已经创建,如果未创建,则进行实例化,然后返回。
懒汉式的具体实现代码如下(考虑线程安全):
```java
public class Singleton {
private static volatile Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
这段代码使用了双重检查锁定(Double-Checked Locking),确保在多线程环境下也能正确创建单例,同时减少了同步开销。
### 饿汉式单例模式
与懒汉式不同,饿汉式在类加载时就创建了单例对象,即使这个对象可能从未被使用。这种方式确保了线程安全,但可能会浪费内存资源。饿汉式的实现相对简单:
```java
public class Singleton {
private static final Singleton INSTANCE = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return INSTANCE;
}
}
```
### 饿汉式与懒汉式的区别
1. **初始化时机**:饿汉式在类加载时初始化,懒汉式在首次调用getInstance()时初始化。
2. **线程安全性**:饿汉式天生线程安全,懒汉式如果不采用同步控制则不是线程安全的。
3. **资源消耗**:饿汉式可能造成资源浪费,因为不管是否使用,对象都会在类加载时创建。懒汉式只有在需要时才创建对象,节省了资源。
4. **性能**:饿汉式性能较好,因为初始化时就完成了,而懒汉式在多线程下需要同步控制,性能相对较差。
### 相同点
1. **单例特性**:无论是饿汉式还是懒汉式,都确保了类只有一个实例,且提供全局访问点。
2. **实例共享**:多次调用getInstance()返回的是同一个对象实例,保证了对象的唯一性。
选择哪种方式取决于对性能、资源消耗和初始化时机的具体需求。在并发场景下,懒汉式需要额外的线程安全措施,而饿汉式则不需要。在资源有限但对性能要求较高的环境中,饿汉式可能是更好的选择;而在对资源利用率要求高、对象创建代价较大的情况下,懒汉式更有优势。