什么是对象发布,为什么我们需要它?

15

在我作为Java开发人员面试时,曾被问到一个问题:

什么是对象发布(Object Publishing),为什么我们需要它?

我不确定我是否知道正确答案:

我认为对象发布是指将对象(变量)状态存储在堆内存中。它用于在线程之间共享对象(变量)。

我的回答是否正确?如果我错了,请纠正我。我一直在查找Java语言规范,但没有找到明确回答这个问题的内容。

提示: 这个问题故意用非严格和准确的方式表达——这就是问题所在。

3个回答

20
你的回答非常接近。我会将对象发布定义为一个线程使对象引用对另一个线程可见的行为。通常,这与对象的创建有关:您需要确保新创建的对象以这样的方式发布,以便其他线程可以在初始化状态下看到它。
经典的文本(以及许多其他与线程相关的问题)是Java并发实践。如果你没有一份副本,并且不想去搜索盗版PDF,我不建议你这样做,即使你这样做或可以这样做,你也应该遵循强大的CERT Oracle安全编码标准的建议,即不要发布部分初始化的对象

5
谢谢。来自Java并发编程实战,第3章,第3.2段:发布对象意味着使其可用于当前范围之外的代码,例如通过存储对它的引用,让其他代码可以找到它,从非私有方法返回它或将其传递给另一个类中的方法。 - Roadrunner
我接受了你的答案,因为它指向了我问题的最准确的答案。再次感谢。 - Roadrunner
好的,这并不一定是关于一个线程发布到另一个线程,它更加普遍。它通常在并发的上下文中被谈论,但那是因为它在那个上下文中可能是一个特别重要的事件。 - Tom Anderson

2
发布对象基本上就是创建一个对象的实例,因此该对象可供相应引用使用。通常指的是对象应该被安全地发布,这意味着没有人应该能够看到该对象处于不一致的状态。也就是说,在完全构造之前,它不应该可供使用。但从定义的角度来看,它只是实例化一个对象,这意味着该对象已经发布。

2
我不相信你认为只有在当前范围之外的某些东西可以访问它时,它才被“发布”。JCIP - 3.2 发布和逃逸 - 发布对象意味着使其可用于当前范围之外的代码,例如通过存储对其的引用,其他代码可以找到它。Bloch, Joshua; Goetz, Brian; Peierls, Tim; Bowbeer, Joseph; Holmes, David; Lea, Doug (2006-05-09). Java Concurrency in Practice (Kindle Locations 1230-1231). Pearson Education (US). Kindle Edition. - James

0
“对象发布”不是一个已经确立的技术术语,特别是在Java生态系统中。这个词似乎是Zope(一个Python Web框架)名称的一部分。
我猜你的面试官要么是在公司里使用这个术语并且不知道这一点,要么他们的问题的目的是过滤掉那些无法承认自己不知道某些事情,而会编造东西的人。

我知道这个问题不是严格和确切的。但是面试中很多问题都是这样形成的。这个问题的重点是看看候选人是否能够仅凭提示就确定问题的上下文。对我来说,这似乎是这种类型的问题,但我仍然不能清楚地理解这个问题的背景。 - Roadrunner
2
-1,因为“发布”(通常是“出版”)Java世界中已经确立的技术术语,通常用于“安全发布”的上下文中,而“对象发布”足够接近,我希望知道它的人能够将其识别为同义词。我认为该术语的广泛使用源于其在JCIP中的使用,但我怀疑它并非在那里创造的。 - Tom Anderson
事实上,维基百科上的Zope文章是引领我来这里的原因。它声称Zope是“第一个使用现在常见的对象发布方法的Web系统”。我发现声称OP在Web上是“常见”的这一说法相当难以置信,所以我开始搜索这个话题。这显然是不同的东西。不要错误地认为用相同的词描述的两件事一定是同一件事。 - Isaac Rabinovitch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接