Java语言中的final禁止指令重排序的说法对吗,更精确的说法应该是保证可见性,禁止this引用逃逸吧?

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

阅读 4.3k
1 个回答

我觉得说得很明白,final 只能保证初始化完成后的可见性,无法禁止指令重排序,也无法禁止 this 逃逸,文章中说得是在没有 this 引用逃逸的情况可以保证final 的可见性。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题