我在构造函数中实例化一个内部类,但我没有用它来启动线程或作为事件监听器。例如:
public class Something {
final InnerSomething innerSomething = new InnerSomething();
public Something(Param arg) {
super(arg);
}
private class InnerSomething {...}
...
}
编辑:我复制了&从其他地方粘贴代码并忘记删除“abstract”关键字。
EDIT2:“'this'参考转义”的“我的”定义是“Java Concurrency in Practice”一书中的一个。
使用上面的代码,我允许'this'引用“escape”吗?
答案 0 :(得分:6)
从技术上讲,您是InnerSomething
在 this
的构造函数返回之前将引用Something
的。
但是,如果你没有在InnerSomething
的构造函数中发布引用并且不对它执行任何操作,则不应该产生问题。请注意,最好将innerSomething
私有标记为可以通过package-private字段访问this
。
如果您参考JCiP#3.2.1,他们会说:
更具体地说,
this
引用不应该在构造函数返回之后从线程中转义。this
引用可以由构造函数存储在某处,只要在构造之后它不被另一个线程使用。
答案 1 :(得分:1)
我不相信。 “逃脱”意味着公共访问可变的私人参考。我在你发布的代码中没有看到。
我们是否同意该术语的含义?