写一个单例!延迟加载,线程安全,高性能
上面提到延迟加载,所谓延迟加载,就是指当实际用到该对象时才加载对应类,否则只是声明,并未实际花费资源去初始化对象
首先先来一个最基本的,最最简单的
public class Singleton {
private Singleton() {} //私有的构造函数
private static Singleton instance = null;
public static Singleton getInstance() {
if(instance == null) {
instance = new Singleton();
}
return instance;
}
}
它的问题是什么?
在单线程下,它是没问题的,但是在多线程下,如果多个线程同时调用getInstance,则可能会调用多次new,会产生问题。
怎么解决?
想到使用锁、synchronized等方法
正确的双重检查锁
先判断对象是否已经被初始化,再决定要不要加锁。
public class Singleton {
private volatile static Singleton uniqueSingleton;
private Singleton() {
}
public Singleton getInstance() {
if (null == uniqueSingleton) {
synchronized (Singleton.class) {
if (null == uniqueSingleton) {
uniqueSingleton = new Singleton();
}
}
}
return uniqueSingleton;
}
}
静态内部类法
我们可以把Singleton实例放到一个静态内部类中,这样就避免了静态实例在Singleton类加载的时候就创建对象,并且由于静态内部类只会被加载一次,所以这种写法也是线程安全的
public class Singleton {
private static class Holder {
private static Singleton singleton = new Singleton();
}
private Singleton(){}
public static Singleton getSingleton(){
return Holder.singleton;
}
}