在构造函数中, this引用逸出, 则此时 可能对象实例还没有完全初始化. 比如此对象实例有final int i=47; 因为i还没有初始化, 外部线程去 查看i, 可能会看到i==null的结果. 这就不对了
说仔细一点, 初始化一个对象, 比如代码new TestClass(), 完成了以下操作
- 1).为TestClass对象实例分配内存空间;this指针指向此空间;
- 2).调用TestClass的初始化函数;在TestClass的初始化函数中;
- 2.1).首先调用TestClass的父类的初始化函数,这里是一个递归调用父类初始化函数的过程;
- 2.2).执行TestClass自身的初始化逻辑,如给对象实例成员赋初值.
所以说, 在1) 和 2.2) 之间是有 "空窗期"的, 如果这是this被外部线程拿到, 则可以看到 对象实例 未初始化的实例成员. 比如上面说的final int i == null的现象.