如何通过实例程序揭示并纠正网上关于Java DCL的常见误解及其重要性?

2026-05-05 21:311阅读0评论SEO教程
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计3914个文字,预计阅读时间需要16分钟。

如何通过实例程序揭示并纠正网上关于Java DCL的常见误解及其重要性?

个人创作公约:本人声明,所有创作文章均为原创,如涉及参考任何文章,将明确标注出处。如有疏漏,欢迎批评指正。如发现网上有抄袭本文章的,欢迎举报,并给予积分奖励。

个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判。如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 issue,谢谢支持~

本文基于 OpenJDK 11 以上的版本

最近爆肝了这系列文章 全网最硬核 Java 新内存模型解析与实验,从底层硬件,往上全面解析了 Java 内存模型设计,并给每个结论都配有了相关的参考的论文以及验证程序,我发现多年来对于 Java 内存模型有很多误解,并且我发现很多很多人都存在这样的误解,所以这次通过不断优化一个经典的 DCL (Double Check Locking)程序实例来帮助大家消除这个误解。

首先有这样一个程序, 我们想实现一个单例值,只有第一次调用的时候初始化,并且有多线程会访问这个单例值,那么我们会有:

getValue 的实现就是经典的 DCL 写法。

在 Java 内存模型的限制下,这个 ValueHolder 有两个潜在的问题:

  1. 如果根据 Java 内存模型的定义,不考虑实际 JVM 的实现,那么 getValue 是有可能返回 null 的。
  2. 可能读取到没有初始化完成的 Value 的字段值。

下面我们就这两个问题进行进一步分析并优化。

阅读全文

本文共计3914个文字,预计阅读时间需要16分钟。

如何通过实例程序揭示并纠正网上关于Java DCL的常见误解及其重要性?

个人创作公约:本人声明,所有创作文章均为原创,如涉及参考任何文章,将明确标注出处。如有疏漏,欢迎批评指正。如发现网上有抄袭本文章的,欢迎举报,并给予积分奖励。

个人创作公约:本人声明创作的所有文章皆为自己原创,如果有参考任何文章的地方,会标注出来,如果有疏漏,欢迎大家批判。如果大家发现网上有抄袭本文章的,欢迎举报,并且积极向这个 github 仓库 提交 issue,谢谢支持~

本文基于 OpenJDK 11 以上的版本

最近爆肝了这系列文章 全网最硬核 Java 新内存模型解析与实验,从底层硬件,往上全面解析了 Java 内存模型设计,并给每个结论都配有了相关的参考的论文以及验证程序,我发现多年来对于 Java 内存模型有很多误解,并且我发现很多很多人都存在这样的误解,所以这次通过不断优化一个经典的 DCL (Double Check Locking)程序实例来帮助大家消除这个误解。

首先有这样一个程序, 我们想实现一个单例值,只有第一次调用的时候初始化,并且有多线程会访问这个单例值,那么我们会有:

getValue 的实现就是经典的 DCL 写法。

在 Java 内存模型的限制下,这个 ValueHolder 有两个潜在的问题:

  1. 如果根据 Java 内存模型的定义,不考虑实际 JVM 的实现,那么 getValue 是有可能返回 null 的。
  2. 可能读取到没有初始化完成的 Value 的字段值。

下面我们就这两个问题进行进一步分析并优化。

阅读全文