java的无序机制
2024-08-29 15:56:04
简单说一下上面提到的无序写,这是jvm的特性,比如声明两个变量,String a; String b; jvm可能先加载a也可能先加载b。同理,instance = new Singleton();可能在调用Singleton的构造函数之前就把instance置成了非空。这是很多人会有疑问,说还没有实例化出Singleton的一个对象,那么instance怎么就变成非空了呢?它的值现在是什么呢?想了解这个问题就要明白instance = new Singleton();这句话是怎么执行的,下面用一段伪代码向大家解释一下:
[java]
mem = allocate(); //为Singleton对象分配内存。
instance = mem; //注意现在instance是非空的,但是还没有被初始化。
ctorSingleton(instance); //调用Singleton的构造函数,传递instance.
由此可见当一个线程执行到instance = mem; 时instance已为非空,如果此时另一个线程进入程序判断instance为非空,那么直接就跳转到return instance;而此时Singleton的构造方法还未调用instance,现在的值为allocate();返回的内存对象。所以第二个线程得到的不是Singleton的一个对象,而是一个内存对象。
最新文章
- sql获取汉字的拼音首字母
- Mysql备份系列(2)--mysqldump备份(全量+增量)方案操作记录
- 安装appcan后打开eclipse出错
- Ruby on Rails Tutorial 第四章 Rails背后的Ruby 之 字符串
- okhttputils开源库的混淆配置(Eclipse)
- 系统默认字体Mac OS,Windows,XP,Lunix
- 如何获取drawable目录下的图片绝对路径
- globalCompositeOperation 学习
- 基于Grunt的版本号构建系统新手教程
- Eclipse Jetty插件安装
- apache做反向代理
- BZOJ3282Tree——LCT
- springbank 开发日志 SpringMVC是如何找到handler找到对应的方法并执行的
- Unsupervised Image-to-Image Translation Networks --- Reading Writing
- JS拖拽元素原理及实现代码
- 【Linux】处理数据文件
- MFC程序开始的执行过程详述
- 基于Poco的UTF8、UTF16、GBK、Hex之间的转换
- 【python 3.6】xlwt和xlrd对excel的读写操作
- mysql(四)log