关键字final使用记录

final是Java编程语言的一个非常重要的关键字,它主要是用来防止在运行期优化时的重排序。
final有两个重排序规则:
1、final域的写入在构造函数内与构造对象的引用赋值给一个引用变量不能重排序。(即:先写再引用)
2、初次读一个包含 final 域的对象的引用,与随后初次读这个 final 域,这两个操作之间不能重排序(先获取引用,再读值)
final域又分为基本数据类型与引用类型
final域为基本类型:
写:
1、编译器禁止把final域的写重排序到构造函数之外;
2、在final域写之后,构造函数完成之前,插入一个storestore内存屏障。屏障禁止处理器把final域的写重排序到构造函数之外。
final域可以保证:在对象引用被线程可见之前,final域已经被始化过了,但普通域就不能保证。
读:
处理器通过插入LoadLoad屏障,保证先获取引用,再读值。
final域为引用类型:
写:
与基本类型新增加的是:对含有final域的对象的值的写入,与引用该含有final域对象不能重排序。
读:同基本类型
总结:
基本数据类型:
final域写:禁止构造方法与重排序final域写(构造方法内不受控制),从而保证该对象对所有线程可见时,该对象的final域全部已经初始化过。
final域读:禁止读该对象包含的final域与初次读对象的引用的重排序。
引用数据类型:
新增:禁止一个final修饰的对象的成员域的写入在构造函数对与随后将这个被构造的对象的引用赋值给引用重排序

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值