首页 / JAVA / Java内存模型中的部分构造对象
Java内存模型中的部分构造对象
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Java内存模型中的部分构造对象,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1517字,纯文字阅读大概需要3分钟。
内容图文
我遇到了以下代码in an article somewhere on the Internet:
public class MyInt {
private int x;
public MyInt(int y) {
this.x = y;
}
public int getValue() {
return this.x;
}
}
文章指出
Constructors are not treated special by the compiler (JIT, CPU etc) so it is allowed to reorder instructions from the constructor and instructions that come after the constructor.
此外,关于Java内存模型的this JSR-133 article说明了这一点
A thread that can only see a reference to an object after that object has been completely initialized is guaranteed to see the correctly initialized values for that object’s final fields.
上面提到的MyInt实例似乎是不可变的(除了类没有标记为final)和线程安全,但文章声明它不是.他们声明不能保证x在读取时始终具有正确的值.
但我想到了
only the thread that creates an object should have access to it while it is being constructed
并且Java Tutorials看起来如此支持.
我的问题是:它是否意味着,使用当前的JMM,由于指令重新排序,线程可以访问部分构造的对象?如果是,怎么样?这是否意味着Java教程中的陈述根本不正确?
解决方法:
那篇文章说如果你有像这样的代码
foo = new MyInt(7);
在具有字段的类中
MyInt foo;
然后说明相当于
(reference to new object).x = 7;
foo = (reference to new object);
可以作为某种优化进行交换.这永远不会改变运行此代码的线程的行为,但是有些其他线程可能会在行之后读取foo
foo = (reference to new object);
但在排队之前
(reference to new object).x = 7;
在这种情况下,它会将foo.x视为0,而不是7.也就是说,其他线程可以运行
int bar = someObject.getFoo().getValue();
并以bar等于0结束.
我从来没有见过这样的事情发生在野外,但作者似乎知道他在说什么.
内容总结
以上是互联网集市为您收集整理的Java内存模型中的部分构造对象全部内容,希望文章能够帮你解决Java内存模型中的部分构造对象所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。