没有合适的资源?快使用搜索试试~ 我知道了~
通过实例程序验证与优化谈谈网上很多对于Java DCL的一些误解以及为何要理解Java内存模型.doc
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 96 浏览量
2022-07-08
11:22:01
上传
评论
收藏 4.81MB DOC 举报
温馨提示
试读
23页
通过实例程序验证与优化谈谈网上很多对于Java DCL的一些误解以及为何要理解Java内存模型.doc
资源推荐
资源详情
资源评论
通过实例程序验证与优化谈谈网上很多对于 Java DCL 的一些误解以及为何要理解 Java 内
存模型
个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会
标注出来,如果有疏漏,欢迎大家批判。如果大家发现网上有抄袭本文章的,欢迎举报,并
且积极向这个 仓库 提交 issue,谢谢支持~
本文基于 OpenJDK 11 以上的版本
最近爆肝了这系列文章 全网最硬核 Java 新内存模型解析与实验,从底层硬件,往上全
面解析了 Java 内存模型设计,并给每个结论都配有了相关的参考的论文以及验证程序,我
发现多年来对于 Java 内存模型有很多误解,并且我发现很多很多人都存在这样的误解,所
以这次通过不断优化一个经典的 DCL (Double Check Locking)程序实例来帮助大家消除
这个误解。
首先有这样一个程序, 我们想实现一个单例值,只有第一次调用的时候初始化,并且有多
线程会访问这个单例值,那么我们会有:
getValue 的实现就是经典的 DCL 写法。
在 Java 内存模型的限制下,这个 ValueHolder 有两个潜在的问题:
如果根据 Java 内存模型的定义,不考虑实际 JVM 的实现,那么 getValue 是有可能返
回 null 的。
可能读取到没有初始化完成的 Value 的字段值。
下面我们就这两个问题进行进一步分析并优化。
根据 Java 内存模型的定义,不考虑实际 JVM 的实现,getValue 有可能返回 null 的原
因
在 全网最硬核 Java 新内存模型解析与实验 文章的 7.1. Coherence(相干性,连贯性)与
Opaque 中我们提到过:假设某个对象字段 int x 初始为 0,一个线程执行:
另一个线程执行(r1, r2 为本地变量):
那么这个实际上是两次对于字段的读取(对应字节码 getfield),在 Java 内存模型下,可
能的结果是包括:
r1 = 1, r2 = 1
r1 = 0, r2 = 1
r1 = 1, r2 = 0
r1 = 0, r2 = 0
其中第三个结果很有意思,从程序上理解即我们先看到了 x = 1,之后又看到了 x 变成
了 0.实际上这是因为编译器乱序。如果我们不想看到这个第三种结果,我们所需要的特性
即 coherence。这里由于 private Value value 是普通的字段,所以根据 Java 内存模型来看并
不保证 coherence。
回到我们的程序,我们有三次对字段读取(对应字节码 getfield),分别位于:
由于 1,2 之间有明显的分支关系(2 根据 1 的结果而执行或者不执行),所以无论在什
么编译器看来,都要先执行 1 然后执行 2。但是对于 1 和 3,他们之间并没有这种依赖关
系,在一些简单的编译器看来,他们是可以乱序执行的。在 Java 内存模型下,也没有限制
1 与 3 之间是否必须不能乱序。所以,可能你的程序先执行 3 的读取,然后执行 1 的读
取以及其他逻辑,最后方法返回 3 读取的结果。
剩余22页未读,继续阅读
资源评论
书博教育
- 粉丝: 1
- 资源: 2837
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- rainy-day.jpg
- IMG_20240501_171218.jpg
- Swift-内购封装swift版本
- 经典CNN网络之ResNet 图像分类网络实战项目:7种小麦叶片病害分类(迁移学习)
- Java毕设之ssm010基于ssm的新能源汽车在线租赁管理系统+vue.rar
- Java毕设之ssm009毕业生就业信息统计系统+vue.rar
- Java毕设之ssm008医院门诊挂号系统+jsp.rar
- Java毕设之ssm007亚盛汽车配件销售业绩管理统+jsp.rar
- Java毕设之ssm006基于java的少儿编程网上报名系统+vue.rar
- Java毕设之ssm005基于SSM框架的购物商城系统+jsp.rar
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功