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

关于在对象的构造函数完成之前对对象的引用

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

关于在对象的构造函数完成之前对对象的引用

(在有关构造函数和对象发布的JLS中)没有矛盾吗?

我相信这些是不矛盾的稍微不同的问题。

JLS引用是关于将对象引用存储在构造函数完成之前 其他线程
可以看到它的地方。例如,在构造函数中,您不应将对象放入

static
其他线程使用的字段中,也不应分叉线程。

  public class FinalFieldExample {      public FinalFieldExample() {         ...         // very bad idea because the constructor may not have finished         FinalFieldExample.f = this;         ...      }  }

您也不应该在构造函数中启动线程:

  // obviously we should implement Runnable here  public class MyThread extends Thread {      public MyThread() {         ...         // very bad idea because the constructor may not have finished         this.start();      }  }

即使您所有的字段都

final
在一个类中,在构造函数完成之前将对象的引用共享给另一个线程也不能保证在其他线程开始使用该对象时已经设置了这些字段。

我的答案是关于在构造函数完成后使用不同步的对象。尽管在构造函数,缺乏同步性以及编译器对操作的重新排序方面相似,但这是一个略有不同的问题。

在JLS 17.5-1中,它们 不在 构造函数内部分配静态字段。他们用另一种静态方法分配静态字段:

static void writer() {    f = new FinalFieldExample();}

这是关键的区别。



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

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

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