对于final域,编译器和处理器要遵守两个重排序规则:
1.在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
原因:编译器会在final域的写之后,发现 final 变量的赋值也会通过 putfield 指令来完成,插入一个StoreStore屏障
2.初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。
编译器会在读final域操作的前面插入一个LoadLoad屏障
原文:https://www.cnblogs.com/dalianpai/p/14216012.html