- tags: Java 内存模型
新模型遵循 DRF-SC 方法:保证弱有序和无数据竞争(DRF)的 Java 程序以顺序一致的方式执行。
JSR-133,在 2004 年发布的 Java 5.0 中被采用。规范:The Java Memory Model, 2005。
Java 中程序员需要同步操作建立 happens-before 关系,确保一个线程不会在另一个线程读取或写入时并发的写入非原子变量。主要的同步操作有:
同步原子(volatile)和其它操作
有数据竞争的程序语义
弱有序和无数据竞争(DRF)只保证「无数据」竞争的程序的顺序一致性行为。新的 Java 模型(和原版本一致)出于以下原因定义了「有数据」竞争程序的顺序一致性行为:
- 支持Java的一般安全(security)和安全保障(safety guarantee)。
- 让程序员更容易发现错误。
- 使攻击者更难利用问题,因为由于数据竞争的原因可能造成的损失更有限。
- 让程序员更清楚他们的程序是做什么的
新的模型不再依赖内存一致性(coherence),取而代之的复用 happens-before(已经用于决定程序是否存在竞争)来决定竞争读写的结果。
具体规则参见:Java 决定竞争读写的具体规则。使用 happens-before 并结合Java 同步原子(volatile)就可以建立新的 happen before 关系,是对原始Java内存模型的重大改进。它为程序员提供了更多有用的保证,并使大量重要的编译器优化得到了明确的允。