Java内存模型
先看官方文档:
https://docs.oracle.com/javase/specs/
JSR 133:Java TM内存模型和线程规范修订版:https://www.jcp.org/en/jsr/detail?id=133
JSR:Java规范请求所有JSR的列表:https://jcp.org/en/jsr/all
https://www.jcp.org/en/home/index
JSR是Java Specification Requests的缩写,意思是Java 规范请求。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。
----------
JSR-000133 Java TM内存模型和线程规范修订版 (最终版本):
https://www.jcp.org/aboutJava/communityprocess/final/jsr386/index.html
http://www.cs.umd.edu/~pugh/jmm.pdf
http://openjdk.java.net/jeps/188
该JEP的产品将被放置在 OpenJDK Wiki上。该过程主要在专门的OpenJDK邮件列表上进行。我们希望结果包括以下内容:
-
改进了形式化。将重新制定基础模型的部分内容。我们的目标是修改后的模型可以进行机械检查,并且更易于人类理解。当根据JLS第17章更新措辞时,这也将解决许多学术论文中指出的现有错误。(最早见 David Aspinall和JaroslavŠevčík撰写的“Java内存模型示例:好,坏,丑”)
-
JVM覆盖范围。现有规范侧重于语言级构造。这使得一些问题(例如初始化)未完全定义,特别是对于在JVM上运行的其他语言。这些将通过将核心模型建立在最小字节代码和内在函数集上来解决。
-
扩展范围。现有规范明确涵盖Java线程,锁,监视器以及volatile和final字段。但是,自Java SE 5以来,添加的功能无法在这些术语中严格指定(例如,AtomicX.weakCompareAndSet)。必须解决这些问题。我们还预计在其他即将到来的JEP过程中可能会出现进一步的扩展。
-
C11 / C ++ 11兼容性。C ++ 11和C11标准改编了JSR 133 JMM规范工作的想法。但是,他们还扩展了它们以涵盖仅在JSR 133(见上文)之后已经(或可能)添加到Java的构造。部分原因是因为Java程序可能调用C本机库,所以应该是等效结构具有跨语言的兼容规范的情况。我们将进一步探索是否可以建立跨语言约定以确保这些构造的低级实现在公共平台上兼容。
-
实施指南。JVM实现者,JDK库开发人员和开发人员通常发现依赖于解释JMM如何影响特定问题和解决方案的文档很有用。我们打算提供这样的文件。
-
测试支持。符合内存模型要求很难测试。我们希望与工程师一起设计和实施具有明确规格基础的测试。
-
工具支持。重新构建的模型将适合由软件开发工具使用,这些工具可以分析性地检查竞争条件等错误,以及检查安全属性是否跨越并发执行的错误。虽然工具本身的设计和构造超出了范围,但是这个JEP可以为注释提供指导,以实现高质量的静态和动态分析。
------------------------------------
The Java Memory Model:http://www.cs.umd.edu/users/pugh/java/memoryModel/
Java内存模型
该网页是讨论Java内存模型和Java语言规范第17章的信息的起点。Java Memory Model定义了线程如何通过内存进行交互。过去有点不清楚和不必要的限制,因此进行了修订。这是该修订的参考页面。JSR 133的官方站点 - Java(tm)内存模型和线程规范修订版 - 就在这里。
此页面分为几个部分:
- 内存模型上的主要参考资料。
- 指向邮件列表和档案的指针。
- 内存模型上的其他材料,包括有关双重检查锁定的信息。
- 内存模型上的旧材料现已过时。
- 指示进一步阅读其他来源的材料。
参考资料
对于试图理解内存模型的人来说,这些参考资料是一个很好的起点。在它们之间,它们涵盖了所涉及的大多数主要问题。
- 对于初次访客
- 一个 程序员JSR-133 FAQ资源是可用的。对于那些刚刚意识到这些问题的人来说,这是一个很好的起点。(2004年2月11日)
- 对于JVM和编译器实现者
- Doug Lea的JSR-133烹饪书,是希望实现Java内存模型的编译器编写者的指南。
- Sarita Adve和Kourosh Gharachorloo在1995年撰写了关于记忆模型的教程,这仍然是一本很好的参考和入门书。Compaq Research Report 95/7,1995年9月, 95.7 - 共享内存一致性模型:教程。
- 对于那些希望完全了解内存模型的人
- 关于记忆模型的 期刊提交,结合了Jeremy Manson的论文,POPL论文和CSJP论文。对于那些对内存模型问题有深入讨论感兴趣的人来说,这是最好的选择。(2005年10月7日)。
- JSR-133规范,发送到最终批准选票。这是“官方规范”(2004年8月9日)。它的解释方式并不多。
- 最终字段语义的新表示/描述。这是最终字段语义的简要描述。(2004年5月12日)
JSR 133(Java内存模型)常见问题解答:https://www.cs.umd.edu/~pugh/java/memoryModel/jsr-133-faq.html
JSR 133(Java内存模型)常见问题解答
Jeremy Manson和Brian Goetz,2004年2月
目录
- 无论如何,什么是记忆模型?
- 其他语言,比如C ++,有内存模型吗?
- 什么是JSR 133?
- 重新排序是什么意思?
- 旧的记忆模型出了什么问题?
- 错误同步是什么意思?
- 同步有什么作用?
- 最终字段如何显示更改其值?
- 最终字段如何在新的JMM下工作?
- 挥发物有什么作用?
- 新内存模型是否修复了“双重检查锁定”问题?
- 如果我正在编写VM怎么办?
- 我为什么要在乎?
------------
“双重检查锁定”声明
Double-Checked Locking被广泛引用并用作在多线程环境中实现延迟初始化的有效方法。
不幸的是,当在Java中实现时,它将无法以独立于平台的方式可靠地工作,而无需额外的同步。当用其他语言(如C ++)实现时,它取决于处理器的内存模型,编译器执行的重新排序以及编译器和同步库之间的交互。由于这些都不是用C ++这样的语言指定的,因此对它的工作情况几乎没有什么可说的。可以使用显式内存屏障使其在C ++中工作,但这些障碍在Java中不可用。
-----------------------
同步和Java内存模型
JSR-133编写器编写手册
轻松内存并发
多处理器现在已经普及,并发编程正在成为主流,但典型的多处理器(x86,Sparc,Power,ARM,Itanium)和编程语言(C,C ++,Java)不能提供大多数工作所假设的顺序一致的共享内存。关于语义和验证。相反,他们有微妙的放松 (或弱)内存模型,暴露出对程序员的硬件和编译器优化所产生的行为。而且,这些记忆模型通常只在含糊不清(有时有缺陷)的散文中描述,导致广泛的混淆。该页面收集了一组人员的工作,他们致力于为多处理器程序开发数学上严格且可用的语义。我们主要关注三种处理器架构(x86,Power和ARM),最近的C ++和C语言版本(C ++ 11和C11),以及使用这些模型的推理和验证。
英特尔®64和IA-32架构软件开发人员手册
Fixing the Java Memory Model, Part 1
Fixing the Java Memory Model, Part 2
-------------
https://hllvm-group.iteye.com/group/topic/21468
RednaxelaFX 2010-09-11 |