https://www.cnblogs.com/hexinwei1/p/10025840.html
对于final域,编译器和处理器要遵守两个重排序规则:
- 在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。(先写入final变量,后调用该对象引用)
原因:编译器会在final域的写之后,插入一个StoreStore屏障
- 初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序(先读对象的引用,后读final变量)
原因:编译器会在读final域操作的前面插入一个LoadLoad屏障