java 实现单例模式,线程安全,最多几种实现方式
时间: 2024-12-23 19:24:03 浏览: 18
在 Java 中实现单例模式时,为了保证线程安全性,有多种常见的方法可以考虑:
1. **懒汉式 Singleton** (Double Checked Locking):
这种方式是在类加载时检查实例是否存在,如果没有,则创建并加锁。这是一种常用但不是最简洁的实现,因为每次请求都需要检查和同步。
```java
private volatile static MySingleton instance;
public static MySingleton getInstance() {
if (instance == null) {
synchronized (MySingleton.class) {
if (instance == null) {
instance = new MySingleton();
}
}
}
return instance;
}
```
2. **饿汉式 Singleton**:
类在加载时就初始化了单例实例,无需外部请求时再创建。这种方法一开始就持有实例,因此是线程安全的。
```java
private static final MySingleton instance = new MySingleton();
public static MySingleton getInstance() {
return instance;
}
```
3. **静态内部类 Singleton** (也称为“线程本地 Singleton”):
利用了 `ThreadLocal` 或者匿名内部类来实现线程安全,每个线程都有自己的独立实例,这种方式避免了全局状态,提高了性能。
```java
private static class SingletonHolder {
private static final MySingleton INSTANCE = new MySingleton();
}
public static MySingleton getInstance() {
return SingletonHolder.INSTANCE;
}
```
4. **枚举 Singleton**:
枚举是一种更为简单、直接的方式实现线程安全的单例,因为它本身就保证只有一个实例,并且是线程安全的。
```java
public enum MySingleton {
INSTANCE;
// ... 其他方法
}
```
阅读全文