1, 概述
1.1,Java 语言规范 规定了 JVM 要维护 内部线程类似顺序化语意 (只要程序的最终结果 等同于 它在严格的顺序化环境中执行的结果);
2, 平台的存储模型
2.1, 现代的处理器, 编译器 为了从你的程序中榨取性能, 会用尽手段;
2.2, 在 可共享内存的多处理器 体系架构中, 每个处理器都有自己的缓存, 并且周期性地 与主内存协调一致;
2.3, 处理器 牺牲 存储一致性的保证来换取性能的提升;
同时定义了一些特殊的指令 (存储关卡, 栅栏), 用以在需要共享数据时, 得到额外的存储协调保证;
2.4, 为了帮助 Java 开发者 屏蔽这些跨架构的存储模型之间的不同, Java 提供了自己的内存模型;
JVM 会在适当的位置 插入 存储管卡, 来 解决 JMM 与底层平台存储模型之间的差异化;
3, 重排序
3.1, 各种能够引起操作延迟或者错误执行的不同原因, 统称为: 重排序;
4,Java 存储模型的简介
4.1,Java 存储模型的定义 通过 动作的形式 进行描述;
动作: 变量的读写, 监视器加锁和释放锁, 线程的启动和拼接;
4.2,JMM 为所有的程序内部的动作 定义了一个偏序关系 (happens-before);
当一个变量 被多个线程读取, 至少被一个线程写入时, 如果 读写操作 未按照 happens-before 排序, 就会发生 数据竞争;
一个正确同步的程序 是 没有数据竞争的 程序;
来源: http://www.bubuko.com/infodetail-3327028.html