【Java并发编程系列4】final

本文详细探讨了Java中的final关键字在并发编程中的内存语义,包括禁止指令重排的规则,以及final修饰普通变量、成员变量、方法和类的用法。分析了final如何保证在多线程环境下对final域的正确初始化,以及final引用类型的特殊性。同时,强调了final引用不能在构造函数内“逸出”的重要性,防止线程看到未初始化的对象引用。此外,还简要介绍了final与static的区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

往期精选(欢迎转发~~)

主要讲解final的内存语义和使用方式。

前言

看这篇文章前,建议先看完《Java并发编程系列1-基础知识》,因为相关知识有很强的依赖,这篇文章也是Java内存模型JMM相关文章的最后一篇。

final禁止指令重排分析

该部分内容基本摘抄自《深入理解Java内存模型》,仅加入自己的总结,更详细讲解可以直接参考此书。

对final域的读和写更像是普通的变量访问,编译器和处理器要遵守两个重排序规则:

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

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

下面,我们通过一些示例性的代码来分别说明这两个规则:

public class FinalExample {
    int i;                            //普通变量
    final int j;                      //final变量
    static FinalExample obj;

    public void FinalExample () {     //构造函数
      &n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值