java中final域的内存语义理解

说明

1、对于final域的内存语义,编译器和处理器要遵守两个重排序规则(内部实现也是使用内存屏障):

2、写final域的重排序规则:在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。

读final域的重排序规则:初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。

实例

publicclassFinalExample{
inti;//普通域
finalintj;//final域
staticFinalExampleobj;

publicFinalExample(){
i=1;//写普通域。对普通域的写操作【可能会】被重排序到构造函数之外
j=2;//写final域。对final域的写操作【不会】被重排序到构造函数之外
}

//写线程A执行
publicstaticvoidwriter(){ 
obj=newFinalExample();
}

//读线程B执行
publicstaticvoidreader(){ 
FinalExampleobject=obj;//读对象引用
inta=object.i;//读普通域。可能会看到结果为0(由于i=1可能被重排序到构造函数外,此时y还没有被初始化)
intb=object.j;//读final域。保证能够看到结果为2
}
}

以上就是java中final域的内存语义理解,希望对大家有所帮助。更多Java学习指路:Java基础

原文来自:https://www.py.cn
© 版权声明
THE END
喜欢就支持一下吧
点赞14 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容