final线程安全与工作原理

本文详细探讨了final关键字在Java中的线程安全特性,包括final的语义、内存语义和实现原理。final修饰的字段确保了在并发环境下的不可变性,保证了线程安全。同时,文章介绍了final变量的初始化规则、内存屏障的实现以及与static、volatile的区别,并总结了final的使用规范。
摘要由CSDN通过智能技术生成
1.final语义与使用

final的语义

  • 编译器做的处理

    • 编译器可以跨同步屏障移动对final修饰的字段值进行读取和调用任意或未知的方法
    • 对于final与non-final修饰的字段,允许编译器保存一份final的数据缓存放在寄存器中,对比必须要加载non-final数据的情况下,它不需要从主内存中加载就可以获取​
  • 并发线程下是安全的

    • 对于final修饰的字段在所有线程中是属于不可变(基本类型值不可变,引用类型是引用地址不可变),也就是对于程序员而言,在线程中重新对final修饰的字段赋值将会编译不通过
    • 只有在对象完全初始化之后,线程才能看到对该对象的引用,这样就可以保证看到该对象的final字段的正确初始化值
    基于Happen-Before原则,程序任何对象的初始化happen-before于程序中任何其他的动作操作行为
    因此能够保证不会被重排序,也就是说final修饰的字段在线程读取已经先在构造器中执行写操作
    因而所有线程看到final修饰的变量均为最终最新的版本
    
  • final的使用模型

    • 在对象的构造函数中为对象设置final字段;在对象的构造函数完成之前,不允许在其他线程可以看到的地方对正在构造的对象的引用执行写操作
    • 这样可以保证在线程看到该对象的时候,将始终看到该对象final字段的最终正确构造版本

final的线程安全性

  • 源代码
// Fi
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

疾风先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值