“this”引用外部类如何通过发布内部类实例进行转义?
这在前面被问得略有不同,但要求一个是/否的答案,但我正在寻找书中缺少的解释(Java并发实践),这个明显的大错误将如何被恶意或意外地利用。
发布对象或其内部状态的最后一种机制是发布内部类实例,如清单 3.7 中的 ThisEscape 所示。当 ThisEscape 发布 EventListener 时,它也隐式发布封闭的 ThisEscape 实例,因为内部类实例包含对封闭实例的隐藏引用。
清单 3.7.隐式允许此引用转义。别这样。
public class ThisEscape {
public ThisEscape(EventSource source) {
source.registerListener(
new EventListener() {
public void onEvent(Event e) {
doSomething(e);
}
});
}
}
安全施工实践
ThisEscape 说明了逃逸的一个重要特例 — 当 this 引用在构造过程中逃逸时。当内部 EventListener 实例发布时,封闭的 ThisEscape 实例也是如此。但是,只有在构造函数返回后,对象才处于可预测的一致状态,因此从其构造函数中发布对象可以发布不完整构造的对象。即使发布是构造函数中的最后一个语句,也是如此。如果此引用在构造过程中转义,则认为对象未正确构造。[8]
[8] 更具体地说,在构造函数返回之前,this 引用不应该从线程中转义。构造函数可以将 this 引用存储在某个位置,只要在构造之前不被另一个线程使用即可。清单 3.8 中的 SafeListener 使用此技术。
在施工过程中,不要让此引用逃逸。
有人如何对此进行编码以在完成构造之前访问OuterClass?第一段中斜体字中提到的隐藏的内部类引用
是什么?