java懒汉_java中懒汉式的volatile的问题?
这个其实蛮有趣的。
以文中的这个例子来讲,为避免歧义,我用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的问题?相关推荐
- java引_JAVA中的引用
JDK1.2之后,Java扩充了引用的概念,将引用分为强引用.软引用.弱引用和虚引用四种. 强引用 类似于"Object a = new Object()"这类的引用,只要垃圾强引 ...
- java 事务_Java中事务总结详解(精华)
1.什么是JAVA事务? 通常的观念认为,事务仅与数据库相关. 事务必须服从ISO/IEC所制定的ACID原则.ACID是原子性(atomicity).一致性(consistency).隔离性 (is ...
- [转载] c++多态与java多态性_Java中的多态性
参考链接: Java中的加法和串联 c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meani ...
- java 且_JAVA中逻辑运算符“|”和“”与“||”和“”的用法
1.使用规则: (1)& 可以用作逻辑与的运算符,表示逻辑与(and) a.当运算符两边的表达式的结果都为true时,整个运算结果才为true,否则,只要有一方为false,则结果为false ...
- java 包装类_Java中的包装类
Java中哪些需要包装类 它们将原始数据类型转换为对象.如果我们希望修改传递给方法的参数,则需要对象(因为基元类型是按值传递的). java.util包中的类只处理对象,因此在这种情况下包装类也有帮助 ...
- java 难度_java中难度大一点的面试题
1.请大概描述一下Vector和ArrayList的区别,Hashtable和HashMap的区别.(5) (1)Vector和ArrayList的异同 实现原理,功能相同,可以互用 主要区别: Ve ...
- math java 计算_Java中的数学计算函数汇总
Math类: java.lang.Math类中包含基本的数字操作,如指数.对数.平方根和三角函数. java.math是一个包,提供用于执行任意精度整数(BigInteger)算法和任意精度小数(B ...
- java中的多态性_[转载] c++多态与java多态性_Java中的多态性
参考链接: Java中的加法和串联 c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meani ...
- c++多态与java多态性_Java中的多态性
c++多态与java多态性 Polymorphism is one of the core concepts of OOPS paradigm. The meaning of polymorphism ...
最新文章
- Find Minimumd in Rotated Sorted Array
- 网站迁移的一般步骤、常见问题及解决措施
- python中文软件-Python3.8.3下载
- 光线追踪技术的理论和实践(面向对象)
- 为什么要在游戏中复刻现实?我们能获得怎样的乐趣?
- Android模拟器访问本机服务IP地址
- Node.js入门 - 回调函数
- 有头结点单链表的逆置
- drupal建站系统_容器将如何塑造Drupal生态系统
- java自定义tag,tag文件与tag标记,java自定义标签
- 【kafka】kafka 2.4 static membership功能 group.instance.id
- c++ 中引用()的用法和应用实例
- window sserver 2008 r2安装教程
- 泛微移动端数据库 :H2数据库
- 我的团长我的团第二集
- 运行 Android 的笔记本 Cosmo 已众筹超 130 万美元
- Unity 2D 自定义碰撞系统(一)
- Chrome插件开发--后台监控网页并自动刷新,点击页面元素
- [4G5G专题-30]:物理层-基带无线资源、物理层帧结构、无线资源调度
- 30岁了 该如何谋划自己的未来