博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
双重检查 单例模式 会出现空指针问题
阅读量:5271 次
发布时间:2019-06-14

本文共 602 字,大约阅读时间需要 2 分钟。

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的实例对象,从而导致空指针

 

转载于:https://www.cnblogs.com/epmouse/p/7212559.html

你可能感兴趣的文章
第十一次作业
查看>>
负载均衡策略
查看>>
微信智能开放平台
查看>>
ArcGIS Engine 中的绘制与编辑
查看>>
Oracle--通配符、Escape转义字符、模糊查询语句
查看>>
c# 文件笔记
查看>>
第一页 - 工具的使用(webstorm)
查看>>
Linux 进程资源用量监控和按用户设置进程限制
查看>>
D3.js 之 d3-shap 简介(转)
查看>>
制作满天星空
查看>>
类和结构
查看>>
CSS3选择器(二)之属性选择器
查看>>
adidas crazylight 2018 performance analysis review
查看>>
typeset shell 用法
查看>>
python 之 循环语句
查看>>
心得25--JDK新特性9-泛型1-加深介绍
查看>>
[转]ceph网络通信模块_以monitor模块为例
查看>>
HDOJ 1754 I Hate It(线段树基本操作)
查看>>
latex tree
查看>>
安装NVIDIA驱动时禁用自带nouveau驱动
查看>>