栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

Java对象参考的发布不正确

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Java对象参考的发布不正确

您可以想象对象的创建具有许多非原子功能。首先,您要初始化和发布Holder。但是,您还需要初始化所有私有成员字段并发布它们。

那么,JMM没有规则来进行写入和发布

holder
成员字段-
在发生字段写入之前
holder
发生
initialie()
。这意味着即使
holder
不为null,成员字段对其他线程仍不可见是合法的。

您可能最终会看到类似

public class Holder{    String someString = "foo";    int someInt = 10;}

holder
可能不为null,但
someString
可以为null,
someInt
可以为0。

据我所知,在x86架构下这是不可能发生的,但在其他情况下可能并非如此。

因此,下一个问题可能是

Why does volatile fix this?

JMM说的是,在volatile存储之前发生的所有写操作对于volatile字段的所有后续线程都是可见的。

因此,如果

holder
volatile是可变的,并且您看到
holder
不为null,则基于volatile规则,将初始化所有字段。

为了安全地发布此对象,我们是否必须将持有人初始化设为静态并将其声明为volatile

是的,因为正如我提到的,如果

holder
变量不为null,那么所有写操作都是可见的。

如何抛出assertionError?

如果一个线程注意到

holder
不为空,并且
assertionError
在进入该方法并
n
在第一次读取时调用
0
(默认值),则第二次读取
n
现在可以看到第一个线程的写入。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/404318.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号