1 饿汉式-不要求延迟加载的情况下使用
饿汉方式一:Enum
public enum Singleton {
INSTANCE;
public void whateverMethod() {
}
}
饿汉方式二:静态类变量
如果不需要延迟初始化,饿汉式可以接受,那么可以采用下面的简单方法实现:
- 线程安全
- 实现简单
- 类加载时便初始化实例
- instance为静态变量,利用静态变量实现单例模式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton (){}
public static Singleton getInstance() {
return instance;
}
}
2 懒汉式-明确需要延迟加载情况下
如果不想提前初始化实例,直到使用的时候才初始化。那么采用懒汉式,相对复杂些。
懒汉方式一:静态内部类延迟特性
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
- 静态内部类本身延迟加载,只有调用时才会初始化
- instance变量依旧式利用类的静态变量保证单例实现,无法利用静态内部类实现延迟加载,
懒汉方式二:双重检查锁延迟初始化
public class Singleton {
private volatile static Singleton singleton;
private Singleton (){}
public static Singleton getSingleton() {
if (singleton == null) {
synchronized (Singleton.class) {
if (singleton == null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}