【发布时间】:2018-01-09 15:09:10
【问题描述】:
这是在 java 多线程中的安全构造实践的上下文中。我正在阅读 JCIP 的书,有人可以在下面解释一下吗:
一个对象只有在它之后才处于可预测的、一致的状态 构造函数返回,因此从其内部发布一个对象 构造函数可以发布一个不完全构造的对象。这是 即使该出版物是 构造函数。
这里我想了解具体部分'即使出版物是 构造函数中的最后一条语句'
我知道从构造函数启动线程是不安全的,但是当它是构造函数中的最后一条语句时也不安全吗?
我的猜测是为什么它不安全是,JVM 可以对语句进行重新排序,而最后一个语句将不再是最后一个。请对此发表评论或纠正我的理解。
编辑:有问题我所说的启动线程的意思是泄漏this 引用。而且这种泄漏可能通过多种方式发生,例如发布事件或启动线程。
【问题讨论】:
-
如果你泄漏一个过早的对象是不安全的,即你在你的构造函数中以
this作为参数调用另一个对象的方法。被调用的方法已经访问了传递的引用,但是被引用的对象可能还没有完全构造。 -
我理解这部分,我的问题是如果它是最后一个陈述。我的推理是否正确?
-
也许您正在构造一个派生自您当前所在类的对象。在这种情况下,最终对象尚未完全构造,即使在构造函数中的最后一条语句之后也是如此。
-
您正在阅读的引用是关于内部类的。它不适用于您给出的示例。见stackoverflow.com/questions/28676796/…
-
@yshavit 是吗?好吧,现在想一想——这是一件好事,否则到处都是一堆乱七八糟的用户引用 ;-)
标签: java multithreading