这个其实蛮有趣的。

以文中的这个例子来讲,为避免歧义,我用abc替换了原文中的123:public class Singleton {

private static Singleton s;

private Singleton(){};

public static Singleton getInstance() { //a

if(s == null) { //b

synchronized (Singleton.class) { //c

if(s == null) { //d

s = new Singleton(); //e

}

}

}

return s; //f

}

}

线程A在执行(e)的时候可能是按照重排序后的方式进行的,即下面步骤的1-3-2:1 memory=allocate();// 分配内存 相当于c的malloc

2 ctorInstanc(memory) //初始化对象

3 s=memory //设置s指向刚分配的地址

楼主觉得由于有synchronized块的保护,所以另外一个线程B会等待A执行完(e)之后才会进入synchronized块执行(d)的判断。

而实际上,此处并发问题出在(b)这一行。即B可能在(b)处判断得到变量s不为null,从而直接跳转到(f)将一个未初始化完成的s返回。从而引发NullPointerException。

java懒汉_java中懒汉式的volatile的问题?相关推荐

  1. java引_JAVA中的引用

    JDK1.2之后,Java扩充了引用的概念,将引用分为强引用.软引用.弱引用和虚引用四种. 强引用 类似于"Object a = new Object()"这类的引用,只要垃圾强引 ...

  2. java 事务_Java中事务总结详解(精华)

    1.什么是JAVA事务? 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (is ...

  3. [转载] c++多态与java多态性_Java中的多态性

    参考链接: Java中的加法和串联 c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meani ...

  4. java 且_JAVA中逻辑运算符“|”和“”与“||”和“”的用法

    1.使用规则: (1)& 可以用作逻辑与的运算符,表示逻辑与(and) a.当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false ...

  5. java 包装类_Java中的包装类

    Java中哪些需要包装类 它们将原始数据类型转换为对象.如果我们希望修改传递给方法的参数,则需要对象(因为基元类型是按值传递的). java.util包中的类只处理对象,因此在这种情况下包装类也有帮助 ...

  6. java 难度_java中难度大一点的面试题

    1.请大概描述一下Vector和ArrayList的区别,Hashtable和HashMap的区别.(5) (1)Vector和ArrayList的异同 实现原理,功能相同,可以互用 主要区别: Ve ...

  7. math java 计算_Java中的数学计算函数汇总

    Math类:  java.lang.Math类中包含基本的数字操作,如指数.对数.平方根和三角函数. java.math是一个包,提供用于执行任意精度整数(BigInteger)算法和任意精度小数(B ...

  8. java中的多态性_[转载] c++多态与java多态性_Java中的多态性

    参考链接: Java中的加法和串联 c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meani ...

  9. c++多态与java多态性_Java中的多态性

    c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meaning of polymorphism ...

最新文章

  1. Find Minimumd in Rotated Sorted Array
  2. 网站迁移的一般步骤、常见问题及解决措施
  3. python中文软件-Python3.8.3下载
  4. 光线追踪技术的理论和实践(面向对象)
  5. 为什么要在游戏中复刻现实?我们能获得怎样的乐趣?
  6. Android模拟器访问本机服务IP地址
  7. Node.js入门 - 回调函数
  8. 有头结点单链表的逆置
  9. drupal建站系统_容器将如何塑造Drupal生态系统
  10. java自定义tag,tag文件与tag标记,java自定义标签
  11. 【kafka】kafka 2.4 static membership功能 group.instance.id
  12. c++ 中引用()的用法和应用实例
  13. window sserver 2008 r2安装教程
  14. 泛微移动端数据库 :H2数据库
  15. 我的团长我的团第二集
  16. 运行 Android 的笔记本 Cosmo 已众筹超 130 万美元
  17. Unity 2D 自定义碰撞系统(一)
  18. Chrome插件开发--后台监控网页并自动刷新,点击页面元素
  19. [4G5G专题-30]:物理层-基带无线资源、物理层帧结构、无线资源调度
  20. 30岁了 该如何谋划自己的未来

热门文章

  1. 有人竟然为了两千多的眼镜倒贴10亿???
  2. 直接对梯度下手,阿里达摩院提出新型优化方法,一行代码即可替换现有优化器...
  3. 80年代高考数学卷,共10套,有您做过的高考卷吗?
  4. 4岁的儿子还不会写红黑树,我该怎么办?
  5. 他自学成才,坐拥38w粉丝,技术类第一大号!
  6. Pytorch中的向前计算(autograd)、梯度计算以及实现线性回归操作
  7. 存储器里面的一个采用直接映射方式的32KB缓存-一个四路组相连的缓存,容量为16KB
  8. 期末Linux复习容易迷糊的地方!
  9. Python外壳:代码结构!(推导式和函数 )
  10. 基于OpenCV提取特定区域