使用场景:始终返回同一个对象。比如程序中只存在一个数据库对象;
分类:饿汉式、懒汉式、单列双重校验;
1.饿汉式单列
优点:线程安全;
缺点:浪费内存,加载类时就创建了对象;
public class Singleton {
private final static Singleton INSTANCE = new Singleton();
private Singleton(){}
public static Singleton getInstance() {
return INSTANCE;
}
}
2.懒汉式
优点:节约内存,只在使用时创建对象(懒加载);
缺点:线程不安全;
public class Singleton {
private static Singleton singleton;
private Singleton() {}
public static Singleton getInstance() {
if (singleton == null) {
singleton = new Singleton();
}
return singleton;
}
}
3.单列双重校验
优点:线程安全、懒加载;
public class SingletionDLC {
private volatile static SingletionDLC mInstance;
private SingletionDLC() {}
public static SingletionDLC getmInstance() {
if (mInstance == null) {
synchronized (SingletionDLC.class) {
if (mInstance == null) {
mInstance = new SingletionDLC();
}
}
}
return mInstance;
}
}
为什么会有两个相同的判断呢?主要是提升性能。除了第一次实例化需要进行加锁同步,之后的线程只要进行第一层的if判断不为空即可直接返回,而不用每一次获取单例都加锁同步,因此相比前面两种方式,双重检验锁更佳。