原文解决
http://stackoverflow.com/questions/1588420/how-does-this-escape-the-constructor-in-java
例如: 在一个构造方法中,你创建了一个EventListener内部类(它隐含的引用了当前对象this的方法),并注册到一个监听中。
》因此你的对象就可能被另一个线程使用,尽管它没有完成初始化。public class A {
private boolean isIt;
private String yesItIs;
public A() {
EventListener el = new EventListener() { ....};
StaticListeners.register(el);
isIt = true;
yesItIs = "yesItIs";
}
}
之后可能发生的另外一个问题是:对象A可能被创建完成,所有线程都可以访问A。某个线程访问到的A对象已经创建,yesItIs的值是“yesItIs”,但是isIt是false。不管你相信与否,它都有可能发生。
发生的情况是:同步仅仅是阻塞线程的一部分,另部分线程间可见性。
Java这样做的原因是性能问题:如果所有线程都共享所有数据,线程间的可见性可能损害性能,因此仅仅是同步的数据可以被线程共享。
在使用的时候,尽可能的避免外部类改变内部类的状态