经典单例模式原理
1、单例模式:确保一个类最多只有一个实例,并提供一个全局访问点
2、单例模式的意义
有些对象我们只需要一个:线程池,缓存,硬件设别等。
如果多个实例会造成冲突、结果的不一致性等问题。
使用静态不变量方式来实现,或者使用全局变量。
3、单例模式类图:
经典单例模式存在的问题:
如果存在多个实例,单例是虚拟单例的。尤其是多线程模式下,两个线程按照时间片执行,可能会存在上一个时间片单例未创建完成,下一个时间片会继续创建,这个时候无法保证唯一性,会存在不安全性。
改进方案:
1、使用线程同步getInstance(简单粗暴,耗资源)。
2、“急切”创建实例,使用静态内部工厂实例(更简单粗暴,如果静态内部工厂实例一直未使用,存在资源浪费)。
3、双重检查加锁,volatitle修饰内部工厂属性,geiInstence方法内部使用双重判断(代码多了一点,但是思路清晰):
核心代码片段:
public static Factory getInstance() {
if (uniqueInstance == null) {
synchronized (ChocolateFactory.class) {
if (uniqueInstance == null) {
uniqueInstance = new ChocolateFactory();
}
}
}
return uniqueInstance;
}