规范
使用如下两种单例形式:
- 双重校验锁。
public class Singleton {
private static volatile Singleton sInstance; // 需要volatile关键字防止指令乱序
private Singleton() {}
public static Singleton getInstance() {
// 双重校验锁提高性能
if (sInstance == null) {
synchronized (Singleton.class) {
if (sInstance == null) {
sInstance = new Singleton();
}
}
}
return sInstance;
}
}
- 静态内部类。
public class Singleton {
private Singleton() {}
private static class SingletonHolder {
// 虚拟机在这里会有锁
private static final Singleton INSTANCE = new Singleton();
}
public static Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
制定原则
- 单例的错误使用会导致一些诡异问题,增大发现成本。