一 、饿汉式
class Singleton {
private static final Singleton instance = new Singleton();
private Singleton() {}
public static Singleton getInstance() {
return instance;
}
}
缺点:类每次使用时都会初始化静态成员变量(调用该类的其它方法时也会初始化),浪费内存。
二 、懒汉式
class Singleton {
private static Singleton instance;
private Singleton() {}
public static Singleton getInstance() {
if (instance == null) {
synchronized (Singleton.class) {
if (instance == null) {
instance = new Singleton();
}
}
}
return instance;
}
}
缺点:
会有线程安全问题,加上同步代码块解决线程安全问题但效率低,加上双重检锁提高访问效率。
没有第一次检锁时,无论单例成员变量有没有被初始化线程都会等待。
加上第一次检索,当单例成员变量被初始化后无需等待直接返回对象引用。
三 、登记式
class Singleton {
private Singleton() {}
private static class Holder{
private static final Singleton instance = new Singleton();
}
public static Singleton getInstance() {
return Holder.instance;
}
}
优点:内部类只有在被外部类调用时才会加载,延缓加载时间。