> For the complete documentation index, see [llms.txt](https://yibingxiong.gitbook.io/java-concurrent-programming-art-mini/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://yibingxiong.gitbook.io/java-concurrent-programming-art-mini/di-09-zhang-java-nei-cun-mo-xing/06final-yu-de-nei-cun-yu-yi.md).

# 06-final域的内存语义

## 写final域的重排序规则

* JMM禁止编译器把final域的写重排序到构造函数之外
* 编译器会在final域的写之后，构造函数return之前，插入一个StoreStore屏障。这个屏障禁止处理器把final域的写重排序到构造函数之外

final域写重排序规则可以保证：

在对象引用为任意线程可见之前，对象的final域已经被正确初始化过了，而普通域不具有这个保障

## 读final域的重排序规则

在一个线程中，初次读对象引用与初次读该对象包含的final域，JMM禁止处理器重排序这两个操作

读final域的重排序规则可以确保：

在读一个对象的final域之前，一定会先读包含这个final域的对象的引用。读到了引用，则这个final域一定被初始化了

## final域为引用类型

写final域的重排序规则对编译器和处理器增加了如下约束：在构造函数内对一个final引用的对象的成员域的写入，与随后在构造函数外把这个被构造对象的引用赋值给一个引用变量，这两个操作之间不能重排序
