饿汉式
public class EagerSingleton {
private static final EagerSingleton INSTANCE = new EagerSingleton();
private EagerSingleton() {
if (INSTANCE != null) {
throw new RuntimeException("Singleton instance already exists!");
}
System.out.println("EagerSingleton created");
}
public static EagerSingleton getInstance() {
return INSTANCE;
}
}
懒汉式-同步方法
public class LazySyncSingleton {
private static LazySyncSingleton instance;
private LazySyncSingleton() {
System.out.println("LazySyncSingleton created");
}
public static synchronized LazySyncSingleton getInstance() {
if (instance == null) {
instance = new LazySyncSingleton();
}
return instance;
}
}
懒汉式-双重检查锁
public class DoubleCheckedSingleton {
private static volatile DoubleCheckedSingleton instance;
private DoubleCheckedSingleton() {
System.out.println("DoubleCheckedSingleton created");
}
public static DoubleCheckedSingleton getInstance() {
if (instance == null) {
synchronized (DoubleCheckedSingleton.class) {
if (instance == null) {
instance = new DoubleCheckedSingleton();
}
}
}
return instance;
}
}
静态内部类
public class InnerClassSingleton {
private InnerClassSingleton() {
System.out.println("InnerClassSingleton created");
}
private static class SingletonHolder {
private static final InnerClassSingleton INSTANCE = new InnerClassSingleton();
}
public static InnerClassSingleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
枚举
public enum EnumSingleton {
INSTANCE;
public void doSomething() {
System.out.println("EnumSingleton doing something");
}
private String data = "default";
public String getData() {
return data;
}
public void setData(String data) {
this.data = data;
}
}
ThreadLocal单例
public class ThreadLocalSingleton {
private static final ThreadLocal<ThreadLocalSingleton> threadLocal =
ThreadLocal.withInitial(ThreadLocalSingleton::new);
private ThreadLocalSingleton() {
System.out.println("ThreadLocalSingleton created for thread: "
+ Thread.currentThread().getName());
}
public static ThreadLocalSingleton getInstance() {
return threadLocal.get();
}
public static void main(String[] args) {
new Thread(() -> {
ThreadLocalSingleton instance1 = ThreadLocalSingleton.getInstance();
ThreadLocalSingleton instance2 = ThreadLocalSingleton.getInstance();
System.out.println(instance1 == instance2);
}).start();
}
}
CAS无锁实现
import java.util.concurrent.atomic.AtomicReference;
public class CASSingleton {
private static final AtomicReference<CASSingleton> INSTANCE =
new AtomicReference<>();
private CASSingleton() {
System.out.println("CASSingleton created");
}
public static CASSingleton getInstance() {
while (true) {
CASSingleton instance = INSTANCE.get();
if (instance != null) {
return instance;
}
instance = new CASSingleton();
if (INSTANCE.compareAndSet(null, instance)) {
return instance;
}
}
}
}
容器式单例
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public class ContainerSingleton {
private static final Map<String, Object> BEANS =
new ConcurrentHashMap<>();
private ContainerSingleton() {}
public static void register(String name, Object instance) {
if (BEANS.containsKey(name)) {
throw new RuntimeException("Bean already exists: " + name);
}
BEANS.put(name, instance);
}
@SuppressWarnings("unchecked")
public static <T> T getBean(String name) {
return (T) BEANS.get(name);
}
public static void main(String[] args) {
ContainerSingleton.register("service", new ServiceImpl());
Service service = ContainerSingleton.getBean("service");
}
}
选择建议
- 简单场景,不考虑延迟加载- -> 枚举
- 需要延迟加载,简单安全 --> 静态内部类
- 高性能要求,需要延迟加载 --> 懒汉式-双重检查锁
- 需要防反射、序列化攻击 --> 枚举
- 线程隔离 --> ThreadLocal
- Spring 容器管理 → 使用 @Component + @Scope("singleton")
- 需要传递参数 --> 静态内部类+初始化参数