- final域遵循的两个重排序规则
- 写一个final域的规则和具体实现
- 读一个final域的规则和具体实现
- 引用类型的final域提供的规则
- final域一言蔽之
final域遵循的两个重排序规则
- 构造函数内对一个final字段的写入,和构造函数return这两个操作不可重排序
- 初次读包含final域的对象和读这个对象的final域两个操作不可重排序
写一个final域的规则和具体实现
- 规则:禁止final域的赋值重排序在return后面
- 实现:在构造方法return前,final写后,插入StoreStore屏障
说白了就是只要不发生逃逸,final的引用一定是赋值过了。
读一个final域的规则和具体实现
- 规则:必须先读含有这个final域的对象引用,才可以读final域。这两步不可重排序。
- 实现:读final域前插入LoadLoad屏障
引用类型的final域提供的规则
在构造函数内对final域的引用类型的初始化与赋值都可以被看到,但是之后的修改,可能不被看到。
final域一言蔽之
只要对象正确的被构造出来,且不逃逸,final域在构造方法初始化的值一定是可见的。