双重检查 单例模式 会出现空指针问题
2017-07-20 17:51
363 查看
public static Singleton getInstance() { if (instance == null) { synchronized(Singleton.class) { //1 if (instance == null) //2 instance = new Singleton(); //3 } } return instance; }
简单的理解:
由于java实例化一个对象的操作(new)不是原子性的。所以在线程a 在执行到 代码 3 处时,当3完成了一部分时,instance就已经非null了,
但是此时实例对象并没有构造完成。假如这个时候线程b进来if语句就会得道instance不是null, 会直接拿到未完成的 instance,从而导致空指针。
说明:
java创建一个对象,在java虚拟机上会进行以下三步操作
1、给instance分配内存
2、调用构造方法 初始化
3、指向内存分配区域
这里牵涉到一个重排序的问题。也就是123的执行顺序是随机的。而其中的3执行完后对象就不为null了
所以当3在2的前面执行时,当2执行完3还未执行时,其他线程进来就会返回未执行3的实例对象,从而导致空指针
相关文章推荐
- 单例模式双重检查锁(DCL)问题
- 单例模式双重检查锁问题
- 二十二、应用双重锁定检查于单例模式中的问题
- 单例模式-研磨设计模式--单例模式--双重检查加锁(一)
- Singleton(单例)模式和Double-Checked Locking(双重检查锁定)模式
- 多线程下双重检查锁的问题及解决方法
- Java设计模式之单例模式 double---checked----locking双重检查锁定
- 单例模式与双重检查方案
- Design Pattern_Singleton(单件模式)和Double-Checked Locking(双重检查锁定)
- Java使用double check(双重检查)实现单例模式的一个小细节
- Java内存模型FAQ(十一)新的内存模型是否修复了双重锁检查问题?
- 双重检查锁定及单例模式
- 一个经典的单例模式(双重检查锁)
- C++双重检查锁定模式(DCLP)的风险
- 双重检查模式 (DCL)与单例模式
- C++和双重检查锁定模式(DCLP)的风险
- (设计模式)双重检查的缺陷以及更好的单例模式-java
- 我的Java开发学习之旅------>Java双重检查锁定及单例模式详解(转)
- 【编码随笔】双重指针作形参的数组问题
- 单例模式之双重检查加锁