文章目录
- 单例模式的实现方法--Java
-
- [1. 饿汉式单例模式(在类加载时创建实例):](#1. 饿汉式单例模式(在类加载时创建实例):)
- [2. 懒汉式单例模式(在需要时创建实例,线程不安全):](#2. 懒汉式单例模式(在需要时创建实例,线程不安全):)
- [3. 静态内部类方式(懒加载,且线程安全):](#3. 静态内部类方式(懒加载,且线程安全):)
- [4. 枚举方式:](#4. 枚举方式:)
- [5. 使用容器实现单例:](#5. 使用容器实现单例:)
- 小结:
单例模式的实现方法--Java
在Java中,可以使用多种方式来实现单例模式。以下是一些常见的单例模式实现方式:
1. 饿汉式单例模式(在类加载时创建实例):
java
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {
// 私有构造方法
}
public static Singleton getInstance() {
return instance;
}
}
2. 懒汉式单例模式(在需要时创建实例,线程不安全):
java
public class Singleton {
private static Singleton instance;
private Singleton() {
// 私有构造方法
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
这种实现方式在多线程环境下可能会导致多个线程创建多个实例。为了确保线程安全,可以使用双重检查锁定(Double-Checked Locking):
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;
}
}
3. 静态内部类方式(懒加载,且线程安全):
java
public class Singleton {
private Singleton() {
// 私有构造方法
}
private static class SingletonHolder {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.instance;
}
}
这种方式实现了懒加载,且线程安全,因为静态内部类只会加载一次。
4. 枚举方式:
java
public enum Singleton {
INSTANCE;
public void doSomething() {
// 单例实例方法
}
}
这是一种非常简单且线程安全的方式,枚举保证了只有一个枚举常量。
5. 使用容器实现单例:
java
import java.util.HashMap;
import java.util.Map;
public class SingletonContainer {
private static Map<String, Object> singletonMap = new HashMap<>();
public static void registerSingleton(String key, Object singleton) {
if (!singletonMap.containsKey(key)) {
singletonMap.put(key, singleton);
}
}
public static Object getSingleton(String key) {
return singletonMap.get(key);
}
}
这种方式允许你将多个单例对象存储在一个容器中,然后根据需要检索它们。
小结:
选择哪种方式取决于你的应用程序需求和线程安全要求。
在多线程环境中,双重检查锁定、静态内部类和枚举方式是比较常用的线程安全实现方式。