final关键字的这8个小细节,你get到几个?( 三 )

假设线程 A 在执行 writer()方法,线程 B 执行 reader()方法 。
线程 B 可能就会出现下图所示的重排序

final关键字的这8个小细节,你get到几个?

文章插图
 
可以看到,由于读对象的普通域被重排序到了读对象引用的前面,就会出现线程 B 还未读到对象引用就在读取该对象的普通域变量,这显然是错误的操作 。而 final 域的读操作就“限定”了在读 final 域变量前已经读到了该对象的引用,从而就可以避免这种情况 。
结论:读 final 域的重排序规则可以确保在读一个对象的 final 域之前,一定会先读包含这个 final 域的对象的引用 。
结束今天给大家总结了一下使用 final 关键字容易忽视的一些小细节,看完希望你能有所收获 。




推荐阅读