懒汉模式下,多线程访问时,会创建多个实例,为什么出现创建多个实例的情况就不安全了?能否举实例说明?
不是“出现创建多个实例的情况就不安全了”,而是既然是单例模式,就不应该出现多个实例,否则还要单例干什么,任何可能违背设计者意图的方式,都是“不安全”的。
好比,氧气罩不能提供氧气是不安全的,当然对于一个不需要氧气罩的正常人来说,氧气罩不能提供氧气只是故障,而不会造成什么安全问题。只是是因为氧气罩设计作为生命支持系统的一部分,是给不能呼吸的患者使用,而它不能提供氧气,这是不安全的。
public class LazySingleton {
private LazySingleton(){}
private static LazySingleton singleton;
public static LazySingleton getInstance() {
if (singleton == null)
singleton = new LazySingleton();
return singleton;
}
}
1.设想一下,如果第一个线程进入getInstance,此时对于他来说singleton是null,但是此时cpu调度时间到了,该到了第二个线程进来
2.第二个线程进来,此时singleton也是空的,因此就生成了一个
3.时间到了,线程1此时恢复了,对于他来讲,singleton也是空的,所以也创建了一个