- tags: Memory Model,Java,编程语言内存模型
Java 内存模型
Links to this note
Java
tags: Programming Language Java 生态工具 Maven/Ivy 依赖获取和解决工具 coursier SDKMAN Java 环境和 SDK 管理 SDKMAN 可以实现 Java 环境和一些常见 SDK 的管理,包括:JDK、Scala、sbt 和 Spark 等。 Java 项目构建工具 Maven Graddle Ant JVM Java 内存模型 JVM 设置代理 Java Networking and Proxies
新的 Java 内存模型(2004)
tags: Java 内存模型 新模型遵循 DRF-SC 方法:保证弱有序和无数据竞争(DRF)的 Java 程序以顺序一致的方式执行。 JSR-133,在 2004 年发布的 Java 5.0 中被采用。规范:The Java Memory Model, 2005。 Java 中程序员需要同步操作建立 happens-before 关系,确保一个线程不会在另一个线程读取或写入时并发的写入非原子变量。主要的同步操作有: 同步原子(volatile)和其它操作 参见:Java 同步原子(volatile)。 有数据竞争的程序语义 弱有序和无数据竞争(DRF)只保证「无数据」竞争的程序的顺序一致性行为。新的 Java 模型(和原版本一致)出于以下原因定义了「有数据」竞争程序的顺序一致性行为: 支持Java的一般安全(security)和安全保障(safety guarantee)。 让程序员更容易发现错误。 使攻击者更难利用问题,因为由于数据竞争的原因可能造成的损失更有限。 让程序员更清楚他们的程序是做什么的 新的模型不再依赖内存一致性(coherence),取而代之的复用 happens-before(已经用于决定程序是否存在竞争)来决定竞争读写的结果。 具体规则参见:Java 决定竞争读写的具体规则。使用 happens-before 并结合Java 同步原子(volatile)就可以建立新的 happen before 关系,是对原始Java内存模型的重大改进。它为程序员提供了更多有用的保证,并使大量重要的编译器优化得到了明确的允。 happens-before 不排除语无伦次(incoherence) 以前发生的事不排除无用性(acausality)
原始 Java 内存模型(1996)
tags: Java 内存模型,Java Java 是第一个试图写下多线程程序保证的主流语言。它包括: 互斥体(mutex),并定义了它们隐含的内存排序要求。 “volatile” 原子变量: volatile 变量的所有读和写都需要直接在主内存中按程序顺序执行,使得对 volatile 变量的操作以顺序一致的方式进行。 制定了(或者至少试图制定)具有数据竞争的程序的行为。 缺陷 Atomic 需要同步:volatile 原子变量是不同步的,所以它们无助于消除程序其余部分的竞争。不能用于构建新的同步原语。 一致性与编译器优化不兼容:Java 编译器公共子表达式消除(common subexpression elimination)会导致其他线程写入新值无法对消除后表达式生效。