先说一下单例模式的好处:
- 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常客观的一笔系统开销。
- 由于new操作的次数减少,因而对系统内存的使用频率也会降低,者将减轻GC压力,缩短GC停顿时间。
双检查锁机制解决的问题:
- 多线程下延迟加载单例设计模式的线程安全问题。
这种机制既保证了不需要同步代码的异步执行性,又保证了单例的效果。
public class Singleton {
//volatile保证当uniqueInstance变量被初始化成Singleton实例时,多个线程可以正确处理uniqueInstance变量
private volatile static Singleton uniqueInstance;
private Singleton() {
}
public static Singleton getInstance() {
//检查实例,如果不存在,就进入同步代码块
if (uniqueInstance == null) {
synchronized (Singleton.class) {
//进入同步代码块后,再检查一次,如果仍是null,才创建实例
if (uniqueInstance == null) {
uniqueInstance = new Singleton();
}
}
}
return uniqueInstance;
}
}