final域的内存语义

news/2024/12/6 18:46:34/

final域的重排序规则

对于final域,编译器和处理器要遵守两个重排序规则。
1)在构造函数内对一个final域的写入,与随后把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
2)初次读一个包含final域的对象的引用,与随后初次读这个final域,这两个操作之间不能重排序。

写final域的重排序规则

写final域的重排序规则:写final域的重排序规则禁止把final域的写重排序到构造函数之外。这个规则的实现包含下面2个方面。
1)JMM禁止编译器把final域的写重排序到构造函数之外。
2)编译器会在final域的写之后,构造函数return之前,插入一个StoreStore屏障。这个屏障禁止处理器把final域的写重排序到构造函数之外。
对于引用类型,写final域的重排序规则对编译器和处理器增加了如下约束:在构造函数内对一个final引用的对象的成员域的写入,与随后在构造函数外把这个被构造对象的引用赋值给一个引用变量,这两个操作之间不能重排序。
写final域的重排序规则可以确保:在引用变量为任意线程可见之前,该引用变量指向的对象的final域已经在构造函数中被正确初始化过了。

读final域的重排序规则

读final域的重排序规则:在一个线程中,初次读对象引用与初次读该对象包含的final域,JMM禁止处理器重排序这两个操作(注意,这个规则仅仅针对处理器)。编译器会在读final域操作的前面插入一个LoadLoad屏障。
初次读对象引用与初次读该对象包含的final域,这两个操作之间存在 间接依赖关系 。由于编译器遵守间接依赖关系,因此编译器不会重排序这两个操作。大多数处理器也会遵守间接依赖,也不会重排序这两个操作。但有少数处理器允许对存在间接依赖关系的操作做重排序(比如alpha处理器),这个规则就是专门用来针对这种处理器的。
读final域的重排序规则可以确保:在读一个对象的final域之前,一定会先读包含这个final域的对象的引用。

-----------------------------------------------------------------------------摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明


http://www.ppmy.cn/news/87060.html

相关文章

阿拉德手游服务端Centos搭建教程

阿拉德手游服务端Centos搭建教程 大家好我是艾西,又有几天没有更新文章了。这几天看了看还是有不少人对手游感兴趣,今天给大家分享一款早些年大火的pc游戏,现在也有手游了“阿拉德”。 你是否还记得DNF,一天你不小心救了赛丽亚&a…

扩展磁盘大小

此虚拟机之前硬盘大小为40G,需扩展为500G 1.虚拟机设置中,扩展硬盘大小为500G 2.启动此虚拟机,查看当前磁盘大小 3.查看磁盘情况 可查看到当前磁盘大小总共537G,实际使用37G 4.对磁盘分区 刷新分区 查看磁盘情况,可查…

编程的实践理论 第二章 基础的数据结构

第二章 基础的数据结构 一个数据结构是一个数据的集合。数据可能是二进制的值,数字 字符,或者是数据结构。我们认为的基本的结构化的类型是 打包和索引化。这两种结构提供了四种基本的数据结构。 非打包的,非索引化的是束, 打包的,非索引化的是集合 非打包的,索引化的是…

做一个属于自己的坐标系的高德地图(GIS)

第一步:创建node环境&#xff1b; 第二步&#xff1a;创建一个html文件 第三步&#xff1a;引入高德的样式和行为依赖 第四步&#xff1a;创建容器让地图挂载在上边 <div id"map"></div> 第五步&#xff1a;先把地图渲染出来 const gaode new ol.l…

前后端联调统一校验规则

文章目录 统一校验实现1.什么是统一校验2.统一校验的实现&#xff08;1&#xff09;引入依赖&#xff08;2&#xff09;基于注解&#xff08;3&#xff09;使用案例【1】定义校验规则【2】开启校验【3】统一异常处理器捕获校验产生的异常 3.分组校验(1)定义公共的校验分组(2)定…

【论文阅读】CatSQL: Towards Real World Natural Language to SQL Applications

【论文阅读】CatSQL: Towards Real World Natural Language to SQL Applications 文章目录 【论文阅读】CatSQL: Towards Real World Natural Language to SQL Applications1. 来源2. 介绍3. 方法介绍3.1 CatSQL模板3.2 CatSQL 查询生成3.2.1 GraPPa嵌入网络3.2.2 使用CAT解码器…

在SecureCRT下使用sz下载和rz上传文件

安装命令&#xff1a;yum install lrzsz 在某些情况下使用ftp不能上传和下载到指定的目录&#xff0c;特别在项目中&#xff0c;比较麻烦&#xff0c;所以可以使用sz和rz命令可以实现在SecureCRT中上传下载 配置上传下载目录&#xff1a;选择某个session标签&#xff0c;点击…

cookie,localstorage,sessionstorage的区别

1.基本属性&#xff1a; cookie: 可设置失效时间&#xff0c;没有设置的话&#xff0c;默认是关闭浏览器后失效&#xff0c;主要用来保存登录信息 localStorage: 除非被手动清除&#xff0c;否则将会永久保存。 sessionStorage: 仅在当前网页会话下有效&#xff0c;关闭页面或…