• final域遵循的两个重排序规则
  • 写一个final域的规则和具体实现
  • 读一个final域的规则和具体实现
  • 引用类型的final域提供的规则
  • final域一言蔽之

final域遵循的两个重排序规则

  1. 构造函数内对一个final字段的写入,和构造函数return这两个操作不可重排序
  2. 初次读包含final域的对象和读这个对象的final域两个操作不可重排序

写一个final域的规则和具体实现

  1. 规则:禁止final域的赋值重排序在return后面
  2. 实现:在构造方法return前,final写后,插入StoreStore屏障

说白了就是只要不发生逃逸,final的引用一定是赋值过了。

读一个final域的规则和具体实现

  1. 规则:必须先读含有这个final域的对象引用,才可以读final域。这两步不可重排序。
  2. 实现:读final域前插入LoadLoad屏障

引用类型的final域提供的规则

在构造函数内对final域的引用类型的初始化与赋值都可以被看到,但是之后的修改,可能不被看到。

final域一言蔽之

只要对象正确的被构造出来,且不逃逸,final域在构造方法初始化的值一定是可见的。