线程安全的单例模式
字数
335 字
阅读时间
2 分钟
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 volatile Singleton instance = null;
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 someMethod() {
// 方法实现
}
}
5 使用 synchronized
方法
简单但性能较低。
java
public class Singleton {
private static Singleton instance = null;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
6 使用 ThreadLocal
(特定于线程)
每个线程都有自己的实例,不适用于全局共享。
java
public class Singleton {
private static final ThreadLocal<Singleton> threadLocalInstance = ThreadLocal.withInitial(Singleton::new);
private Singleton() {}
public static Singleton getInstance() {
return threadLocalInstance.get();
}
}