为什么要使用单例模式?
一些对象只需要一个,比方说:threadPool,cache,对话框,处理偏好设置和registry的对象,使用单例模式能够再真正需要该对象的时候再创建,避免浪费资源。
经典单例模式
public class Singleton { private static Singleton uniqueInstance; private Singleton() {} public static Singleton getInstance() { if(Objects.isNull(uniqueInstance)) { uniqueInstance = new Singleton(); } return uniqueInstance; } }
缺点:
多线程造成多个实例的风险。
解决方案1:
public class Singleton { private static Singleton uniqueInstance; private Singleton() {} public static synchronized Singleton getInstance() {
if(Objects.isNull(uniqueInstance)) { uniqueInstance = new Singleton(); } return uniqueInstance; }
}
缺点:
直接同步会使得线程每次都会被阻拦再该方法外,即使该对象已被实例化。
解决方案2:
public class Singleton { private static volatile Singleton uniqueInstance; private Singleton() {}
public static synchronized Singleton getInstance() {
// 检查实例,如果不存在,就进入同步区块 if(Objects.isNull(uniqueInstance)) {
synchronized(Singleton.class) {
// 进入区块后,再检查一次
if(uniqueInstance == null) { uniqueInstance = new Singleton();
}
} } return uniqueInstance; }
}
这种方法能够解决多线程的问题又能兼顾性能
解决方案3:
public class Singleton { private static Singleton uniqueInstance = new Singleton(); private Singleton() {} public static Singleton getInstance() { return uniqueInstance; } }
静态变量直接初始化,适合那些初始化不怎么耗费资源的对象。