Java中双重检查锁定中的volatile
参见英文答案 >
Why is volatile used in double checked locking????????????????????????????????????6个
据我所知,这是Java中双重检查锁定模式的正确实现(自Java 5起): class Foo { private volatile Bar _barInstance; public Bar getBar() { if (_barInstance == null) { synchronized(this) { // or synchronized(someLock) if (_barInstance == null) { Bar newInstance = new Bar(); // possible additional initialization _barInstance = newInstance; } } } return _barInstance; } } 假设只有通过getBar访问_barInstance,我想知道是否缺少volatile是一个严重的错误,或者只是一个可能的性能缺陷的轻微缺陷. 我的想法如下:synchronized介绍发生之前的关系.初始化_barInstance的线程将其值写入主内存,而不是同步块.因此,即使它不是volatile,也不会有_barInstance的双重初始化:其他线程在_barInstance的本地副本中为空(在第一次检查中为true),但必须在第二次检查中从主内存读取新值进入synchronized块后检查(获取false并不重新初始化).所以唯一的问题是每个线程的锁定获取过多. 据我所知,它在CLR中是正确的,我相信它在JVM中也是正确的.我对吗? 谢谢. 解决方法
在以下情况下,不使用volatile可能会导致错误:
>线程1进入getBar()并发现_barInstance为null volatile修饰符将禁止相对于任何先前的读或写写入或读取变量_barInstance.因此,它将确保线程2不会看到部分构造的对象. 有关详细信息:http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- java – 在UML复合结构图中定义“端口”的概念
- java – Quartz&Spring – 集群但不持久?
- DataOutputSteam给我一个’java.io.IOException:
- java – 如何调整JLabel ImageIcon的大小?
- ArrayList VS Vector(ArrayList和Vector的区别)_
- java – Android Service-Activity 2方式通信
- java-Tomcat中的多个上下文路径可以服务一个appB
- java – 将SimpleDateFormat转换为DateTimeForma
- Java语言描述MD5加密工具类实例代码
- Java的动态代理实际上如何工作?