您可以阅读Java语言规范17.5的相关部分。最后的领域语义学
第一个相关部分(我加强调):
对象的构造函数完成后,就认为该对象已完全初始化。 保证只有在对象完全初始化之后才能看到对对象的引用的线程才能
确保看到该对象的最终字段的正确初始化值。
该
this引用不被构造完成之前任何其他线程看到的,所以它的罚款。
this构造函数中的引用“转义” 没有什么神奇之处。相关的事情是(构造函数完成之前)
没有其他线程可以看到它 。
JLS的下一段对此进行了扩展(我添加了强调和斜体):
final字段的使用模型很简单:在该对象的构造函数中为该对象设置final字段;并且 不要 在对象的构造函数完成之前, 在另一个线程可以看到它
的地方编写对正在构造的对象的引用。如果执行此操作,则当另一个线程看到该对象时,该线程将始终看到该对象的最终字段的正确构造版本。



