- 写内存语义:在构造函数内对一个 final 域的写入,与随后将对象引用赋值给引用变量,这两个操作不能重排序。
- 读内存语义:初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作不能重排序。
写内存语义可以确保在对象的引用为任意线程可见之前,final 域已经被初始化过了。
读内存语义可以确保如果对象的引用不为 null,则说明 final 域已经被初始化过了。
总之,final 域的内存语义提供了初始化安全保证。
【内存语义的实现原理】
- 在 final 域的写之后,构造函数 return 之前,插入一个 StoreStore 屏障。
- 在读 final 域之前插入一个 LoadLoad 屏障。