目录
[1. 懒汉式(Lazy Initialization)](#1. 懒汉式(Lazy Initialization))
[2. 线程安全的懒汉式](#2. 线程安全的懒汉式)
[3. 双重检索锁(Double-Check Locking)](#3. 双重检索锁(Double-Check Locking))
[4. 饿汉式(Hungry Initialization)](#4. 饿汉式(Hungry Initialization))
[5. 使用枚举](#5. 使用枚举)
单例模式是设计模式中的一种重要模式,主要用于确保一个类只有一个实例,并提供一个全局访问点。它在许多场景中都非常有用,比如在配置管理、线程池、日志记录等中。
一、单例模式的实现方式
单例模式通常有几种常见的实现方式:
1. 懒汉式(Lazy Initialization)
在这种实现方式中,单例实例是在第一次使用时创建的,直到那时才实例化。这种方式是延迟加载。
(1)代码
java
public class Singleton {
private static Singleton instance;
private Singleton() {
// 私有构造函数防止外部实例化
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
(2)缺点
在多线程环境下,可能会导致创建多个实例。
2. 线程安全的懒汉式
为了在多线程环境中确保安全,可以使用 synchronized 关键字
(1)代码
java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
(2)缺点
每次调用 getInstance 时都需要加锁,可能影响性能。
3. 双重检索锁(Double-Check Locking)
通过双重检查来减少同步开销
public class Singleton {
private static Singleton instance;
代码
java
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
4. 饿汉式(Hungry Initialization)
实例在类加载时创建,不需要延迟加载。
(1)代码
java
public class Singleton {
// 静态实例在加载的时候创建
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
(2)优点
线程安全,简单;缺点是在类加载时就创建了实例,可能会浪费资源。
5. 使用枚举
Java的枚举可以很好地实现单例模式,既简单又线程安全。
代码
java
public enum Singleton {
INSTANCE;
public void someMethod() {
// 业务逻辑
}
}
二、使用单例模式的注意事项
1、序列化保护
如果单例类实现了`Serializable`接口,必须定义`readResolve`方法,以防止在反序列化时创建新的实例。
2、懒加载和性能
选择懒加载时要考虑性能问题,尤其是在多线程环境中。
3、内存泄露
确保使用强引用,不要因单例导致内存泄露。