单例模式确保一个类只有一个实例,并提供一个全局访问点来访问它。
public class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
public class Singleton {
private static Singleton instance;
private Singleton() {}
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
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;
}
}
volatile
防止指令重排public class Singleton {
private Singleton() {}
private static class Holder {
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return Holder.instance;
}
}
public enum Singleton {
INSTANCE;
public void doSomething() {
System.out.println("Doing something...");
}
}
private Singleton() {
if (instance != null) {
throw new RuntimeException("反射破坏单例!");
}
}
private Object readResolve() {
return instance;
}
实现方式 | 是否懒加载 | 是否线程安全 | 推荐度 |
---|---|---|---|
饿汉式 | 否 | 是 | ★★ |
懒汉式 | 是 | 否 | ★ |
synchronized | 是 | 是 | ★★ |
DCL | 是 | 是 | ★★★★ |
静态内部类 | 是 | 是 | ★★★★★ |
枚举 | 否 | 是 | ★★★★★(最安全) |