是的,这是一个学术性问题,我知道人们会抱怨我没有发布任何代码,但我确实对这个问题感到震惊,真的不知道从哪里开始。我真的很感谢一个解释,也许还有一些代码示例。
如果对象构造函数启动了一个新线程,该线程执行匿名内部类对象的方法运行,则此新线程可能会在其完全构造并且其字段完全初始化之前可以访问其周围的外部对象。您如何防止这种情况发生?
这称为“泄漏”。这里有代码
public class Test {
// this is guaranteed to be initialized after the constructor
private final int val;
public Test(int v) {
new Thread(new Runnable() {
@Override public void run() {
System.out.println("Val is " + val);
}
}).start();
this.val = v;
}
}
猜猜它将打印什么(可能是线程)。我使用一个final
字段来强调对象已完全初始化之前已被访问(最终字段必须在每个构造函数的最后一行之后明确分配)
你如何恢复
this
在构造函数中时,您不想传递。这也意味着您不希望在完全相同的类(非静态,非私有)中调用非最终虚拟方法,并且不使用隐式链接到封装的内部类(匿名类是内部类)实例,因此他们可以访问this
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句