- 对于 final 域,编译器和CPU要遵守两个重排序规则:
final 写:“构造函数内对一个final域的写入”,与“随后把这个被构造对象的引用赋值给一个引用变量”,这两个操作之间不能重排序。
final 读:“初次读一个包含final域的对象的引用”,与“随后初次读对象的final域”,这两个操作之间不能重排序。 - 写 final 域的重排序规则禁止把 final 域的写重排序到构造函数之外。这个规则的实现包含下面两个方面:
1, JMM 禁止编译器把 final 域的写重排序到构造函数之外。
2, 编译器会在 final 域的写之后,构造函数 return 之前,插入一个 StoreStore 屏障。这个屏障禁止处理器把 final 域的写重排序到构造函数之外。 - 读 final 域的重排序规则如下:
在一个线程中,“初次读对象引用"与"初次读该对象包含的 final 域”,JMM 禁止处理器重排序这两个操作(注意,这个规则仅仅针对处理器)。
编译器会在读 final 域操作的前面插入一个 LoadLoad 屏障。
初次度该对象与读该对象的final域有关联关系,大多数处理器不会进行重新排序,少量处理器会允许对具有间接关联关系的两个操作重新排序,如alpha处理器,该规则就是针对这类处理器的
并发学习-final
最新推荐文章于 2024-05-03 05:45:04 发布