题目
介绍下单例模式及其实现方式
答案
@[toc]
## 什么是单例模式
单例模式(Singleton Pattern)确保一个类只有一个实例,并提供了一个全局访问点来访问该实例。
注意:
1、单例类只能有一个实例。
2、单例类必须自己创建自己的唯一实例。
3、单例类必须给所有其他对象提供这一实例。
## 单例模式的实现方式
### 饿汉式(线程安全)
```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;
private LazySingleton() {}
public static LazySingleton getInstance() {
if (instance == null) {
instance = new LazySingleton();
}
return instance;
}
}
```
**特点**:延迟加载,但多线程环境下可能创建多个实例。
### 同步懒汉式(线程安全)
```java
public class SyncLazySingleton {
private static SyncLazySingleton instance;
private SyncLazySingleton() {}
public static synchronized SyncLazySingleton getInstance() {
if (instance == null) {
instance = new SyncLazySingleton();
}
return instance;
}
}
```
**特点**:通过`synchronized`保证线程安全,但性能较差。
### 双重检查锁(DCL,线程安全)
```java
public class DCLSingleton {
private static volatile DCLSingleton instance;
private DCLSingleton() {}
public static DCLSingleton getInstance() {
if (instance == null) {
synchronized (DCLSingleton.class) {
if (instance == null) {
instance = new DCLSingleton();
}
}
}
return instance;
}
}
```
**特点**:延迟加载 + 高效线程安全,需`volatile`防止指令重排序。
### 静态内部类(线程安全)
```java
public class InnerClassSingleton {
private InnerClassSingleton() {}
private static class Holder {
private static final InnerClassSingleton instance = new InnerClassSingleton();
}
public static InnerClassSingleton getInstance() {
return Holder.instance;
}
}
```
**特点**:利用类加载机制保证线程安全,延迟加载且无锁。
### 枚举(线程安全,防反射/序列化攻击)
```java
public enum EnumSingleton {
INSTANCE;
public void doSomething() {
// 业务方法
}
}
```
**特点**:JVM 保证单例,天然防反射、序列化破坏,推荐使用。
### 对比总结
| 实现方式 | 线程安全 | 延迟加载 | 防反射 | 防序列化 | 性能 |
| :--------- | :------- | :------- | :----- | :------- | :--- |
| 饿汉式 | ✔️ | ❌ | ❌ | ❌ | 高 |
| 懒汉式 | ❌ | ✔️ | ❌ | ❌ | 高 |
| 同步懒汉式 | ✔️ | ✔️ | ❌ | ❌ | 低 |
| 双重检查锁 | ✔️ | ✔️ | ❌ | ❌ | 中 |
| 静态内部类 | ✔️ | ✔️ | ❌ | ❌ | 高 |
| 枚举 | ✔️ | ❌ | ✔️ | ✔️ | 高 |
### 最佳实践
- 需要延迟加载 → **静态内部类**
- 需要防反射/序列化 → **枚举**
- 旧版本兼容场景 → **双重检查锁**
