见深入理解Java虚拟机 JVM高级特性与最佳实践 第12章
除了volatile之外,Java还有两个关键字能实现可见性,即synchronized和final。同步块的可见性是由“对一个变量执行unlock操作之前,必须先把此变量同步回主内存中(执行store、write操作)”这条规则获得的,而final关键字的可见性是指:被final修饰的字段在构造器中一旦初始化完成,并且构造器没有把“this”的引用传递出去(this引用逃逸是一件很危险的事情,其他线程有可能通过这个引用访问到“初始化了一半”的对象),那在其他线程中就能看见final字段的值。
我觉得说得很明白,final 只能保证初始化完成后的可见性,无法禁止指令重排序,也无法禁止 this 逃逸,文章中说得是在没有 this 引用逃逸的情况可以保证final 的可见性。