【发布时间】:2015-04-24 22:54:27
【问题描述】:
早前but asking for a yes/no answer 提出的问题略有不同,但我正在寻找书中(Java 并发实践)中缺少的解释,说明这个明显的大错误将如何被恶意或意外利用。
一种最终机制,通过该机制可以使对象或其内部状态 published 就是发布一个内部类实例,如图 清单 3.7 中的 ThisEscape。当 ThisEscape 发布 EventListener,它隐式发布封闭的 ThisEscape 实例也是如此,因为 内部类实例包含一个隐藏的 引用封闭实例。
清单 3.7。隐式允许 this 引用转义。别 这样做。
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
3.2.1。安全施工实践
ThisEscape 说明了一个重要的特殊情况,即当 这个引用在施工期间逃逸。当内 EventListener 实例已发布,封闭的 ThisEscape 也已发布 实例。但是一个对象只是处于可预测的、一致的状态 在其构造函数返回之后,因此从其内部发布一个对象 构造函数可以发布一个不完全构造的对象。这是 即使发布是构造函数中的最后一条语句也是如此。 如果 this 引用在构造过程中转义,则该对象是 [8]
[8] 更具体地说,this 引用不应从 线程直到构造函数返回。这个参考可以是 由构造函数存储在某个地方,只要它不被 另一个线程直到施工之后。清单 3.8 中的 SafeListener 使用这种技术。
在构造过程中不允许 this 引用逃逸。
如何在 OuterClass 完成构建之前对其进行编码以到达 OuterClass?第一段斜体中提到的hidden inner class reference是什么?
【问题讨论】:
-
访问外部类实例的语法是
OuterClassName.this。我不明白你的其余问题。 -
您的代码示例无法编译。
标签: java multithreading concurrency constructor