上传者: 38670420
|
上传时间: 2026-04-17 11:36:35
|
文件大小: 86KB
|
文件类型: PDF
单例模式是软件设计模式中的一种,它的核心思想是确保一个类只有一个实例,并提供一个全局访问点。在Java中,由于语言特性,实现单例模式有多种方式,每种方式都有其优缺点。以下是Java中7种常见的单例模式实现方式的详细说明:
1. **懒汉式(线程不安全)**:
这是最直观的实现,但不是线程安全的。在多线程环境中,可能导致多个实例的创建。
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
2. **懒汉式(线程安全,同步方法)**:
使用`synchronized`关键字确保了线程安全,但每次调用`getInstance()`都会进行同步,降低了效率。
```java
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
```
3. **饿汉式**:
在类加载时就初始化实例,确保了线程安全,但失去了懒加载的优点。
```java
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
```
4. **饿汉式(变种)**:
类似于第三种,但在静态块中初始化,同样在类加载时完成实例化。
```java
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
static {
instance = new Singleton();
}
public static Singleton getInstance() {
return instance;
}
}
```
5. **静态内部类**:
利用类加载机制保证线程安全,只有在调用`getInstance()`时才加载内部类,实现了延迟加载。
```java
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton() {}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
```
6. **双重检查锁定(DCL,Double-Checked Locking)**:
在多线程环境下兼顾了线程安全和懒加载,是推荐的实现方式。
```java
public class Singleton {
private volatile static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
```
7. **枚举**:
通过枚举方式实现单例,既简单又线程安全,同时防止反射攻击。
```java
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
```
每种实现方式都有其适用场景。例如,如果初始化过程非常耗时或资源密集,可能需要选择懒加载的方式;而在性能要求较高的系统中,可能会选择饿汉式或枚举方式。了解并掌握这些实现方式,可以帮助开发者根据实际需求选择最适合的单例模式实现。