# 普通单例模式的实现
合格的单例模式的实现,至少要保证以下三点:
- 实现单例功能;
- 延迟加载;
- 并发时不出错。
# 1. 饿汉式
public class Singleton {
private static Singleton instance = new Singleton();
private Singleton() {
}
public static Singleton getInstance() {
return instance;
}
}
- 饿汉模式的缺点:可能在还不需要此实例的时候就已经把实例创建出来了,没起到 lazy loading 效果。
- 饿汉模式的优点:实现简单,而且安全可靠。
# 2. 懒汉式
public class Singleton {
private static Singleton instance;
private Singleton() {
}
public static Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
}
- 懒汉模式的优点:弥补了饿汉模式的缺点,起到了 lazy loading 的效果。
- 懒汉模式的缺点:多线程并发时有线程安全问题,有可能创建多个实例。
# 3. 双校验懒汉式
public class SingletonSafe {
private static volatile SingletonSafe singleton;
private SingletonSafe() {
}
public static SingletonSafe getSingleton() {
if (singleton == null) {
synchronized (SingletonSafe.class) {
if (singleton == null) {
singleton = new SingletonSafe();
}
}
}
return singleton;
}
}
- 双校验懒汉模式的优点:弥补了懒汉模式的缺点,防止了并发问题。
- 双校验懒汉模式的缺点:因为涉及到锁,因此性能有损耗;代码变得更复杂。