重排序规则

写final域的重排序规则:
  1. 禁止对final域的写重排序到构造函数之外
    编译器会在final域写之后,构造函数return之前,插入一个storestore屏障,这个屏障可以禁止处理器把final域的写重排序到构造函数之外。
  2. 禁止在构造函数对一个final修饰的对象的成员域的写入与随后将这个被构造的对象的引用赋值给引用变量重排序。
读final域重排序规则:
  1. 在一个线程中,初次读对象引用和初次读该对象包含的final域,JMM会禁止这两个操作的重排序。
    处理器会在读final域操作的前面插入一个LoadLoad屏障。

参考:

Java并发系列六:深入了解final关键字