在Java中,单例模式是一种常见的设计模式,用于确保一个类只有一个实例
,并提供全局访问点
下面介绍七种常见的单例模式实现方式以及它们的优缺点。
1. 懒汉式(线程不安全)
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
优点:简单易实现。
缺点:多线程环境下可能会创建多个实例
。
2. 懒汉式(线程安全,加锁)
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
优点:线程安全。
缺点:加锁会影响性能。
3. 饿汉式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
优点:线程安全,不需要加锁。
缺点:类加载时即创建实例,可能造成资源浪费
。
4. 双重检查锁
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;
}
}
优点:延迟加载,线程安全
。
缺点:实现复杂。
5. 静态内部类
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
优点:延迟加载,线程安全
。
缺点:实现稍复杂。
6. 枚举单例
public enum Singleton {
INSTANCE;
public void doSomething() {
// Do something
}
}
优点:简单、线程安全、防止反射和序列化攻击
。
缺点:无法延迟加载。
7. 使用容器实现单例
public class SingletonManager {
private static Map<String, Object> objectMap = new HashMap<>();
private SingletonManager() {}
public static void registerService(String key, Object instance) {
if (!objectMap.containsKey(key)) {
objectMap.put(key, instance);
}
}
public static Object getService(String key) {
return objectMap.get(key);
}
}
优点:可以管理多个单例对象。
缺点:需要手动管理对象的注册和获取
。