关于synchronized关键字的问题
来源:互联网 发布:梦回唐朝 知乎 编辑:程序博客网 时间:2024/06/06 03:06
在Java指令中创建对象和赋值操作是分开进行的,也就是说instance = new Singleton();语句是分两步执行的。但是JVM并不保证这两个操作的先后顺序,也就是说有可能JVM会为新的Singleton实例分配空间,然后直接赋值给instance成员,然后再去初始化这个Singleton实例。这样就可能出错了,我们以A、B两个线程为例:
a>A、B线程同时进入了第一个if判断
b>A首先进入synchronized块,由于instance为null,所以它执行instance = new Singleton();
c>由于JVM内部的优化机制,JVM先画出了一些分配给Singleton实例的空白内存,并赋值给instance成员(注意此时JVM没有开始初始化这个实例),然后A离开了synchronized块。
d>B进入synchronized块,由于instance此时不是null,因此它马上离开了synchronized块并将结果返回给调用该方法的程序。
e>此时B线程打算使用Singleton实例,却发现它没有被初始化,于是错误发生了。
所以程序还是有可能发生错误,其实程序在运行过程是很复杂的,从这点我们就可以看出,尤其是在写多线程环境下的程序更有难度,有挑战性。我们对该程序做进一步优化:
1 0
- 关于synchronized关键字的问题
- 关于java的synchronized 关键字
- 关于java中的synchronized关键字的理解
- 关于synchronized关键字的那些事儿
- 关于java中的synchronized关键字的理解
- 关于java关键字synchronized的一些心得体会
- 关于synchronized关键字的一点补充
- 关于java synchronized关键字的一些理解
- 关于synchronized关键字
- 多线程问题汇总<synchronized关键字的用法>
- 关于synchronized关键字小谈
- 关于java中的synchronized关键字的一些小研究
- Java关于Synchronized关键字在不同位置使用的理解
- [转载]关于native,transient,volatile,synchronized四个关键字的使用
- 关于native,transient,volatile,synchronized四个关键字的使用
- 关于native,transient,volatile,synchronized四个关键字的使用
- Java关于Synchronized关键字在不同位置使用的理解
- java的synchronized关键字
- Java文件读写IO/NIO及性能比较总结
- Lucene.net+盘古分词:如何做到按需分词,新增盘古分词词库
- typeHandlers元素
- Windows C#入门环境搭建
- JSP content
- 关于synchronized关键字的问题
- socket、tcp、udp、http 的认识及区别
- dp——vijos1751 YYB写强化
- Qt for Android QML实现缩放、拖拽、长按效果简单示例
- 大家好
- 第一章 加载和执行
- AAPT使用
- Unity实现缓慢的LookAt (缓慢旋转对着目标)
- MyBatis环境配置及入门