一、final的禁止重排序
(一)、写:在构造函数中对final域的写入,与随后把这个构造对象的引用赋值给引用变量,两者不能重排序
(1)、JMM禁止编译器把final域的写重排序到构造函数之外;
(2)、编译器会在final域写之后,构造函数return之前,插入一个storestore屏障(关于内存屏障可以看这篇文章)。这个屏障可以禁止处理器把final域的写重排序到构造函数之外。
(二)、读:初次读一个包含final域对象的引用,与随后初次读这个final域,两者之间不能重排序
在一个线程中,初次读对象引用和初次读该对象包含的final域,JMM会禁止这两个操作的重排序。(注意,这个规则仅仅是针对处理器),处理器会在读final域操作的前面插入一个LoadLoad屏障。实际上,读对象的引用和读该对象的final域存在间接依赖性,一般处理器不会重排序这两个操作。但是有一些处理器会重排序,因此,这条禁止重排序规则就是针对这些处理器而设定的。
二、final的修饰
(1)、类:不可被继承
(2)、方法:不可被复写
(3)、变量: 基本数据类型:不可被修改
引用类型:引用的对象不能被别的对象引用
参考:
版权声明:本文为CSDN博主「riemann_」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/riemann_/java/article/details/96390511
网友评论