【并发编程】必须要知道的顺序一致性与其内存模型
推荐阅读
- 学习笔记 《 深入理解 Java 虚拟机》
- 学习笔记 《 后端架构设计》
- 学习笔记 《 Java 基础知识进阶》
- 学习笔记 《 Nginx 学习笔记》
- 学习笔记 《 前端开发杂记》
- 学习笔记 《 设计模式学习笔记》
- 学习笔记 《 DevOps 最佳实践指南》
- 学习笔记 《 Netty 入门与实战》
- 学习笔记 《 高性能MYSQL》
- 学习笔记 《 JavaEE 常用框架》
- 学习笔记 《 Java 并发编程学习笔记》
- 学习笔记 《 分布式系统》
- 学习笔记 《 数据结构与算法》
顺序一致性内存模型是一个理论参考模型,在设计的时候,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参照。
1、数据一致性与数据竞争
当程序未能正确的进行同步的时候,就会有可能出现数据竞争的问题。Java中数据竞争的场景描述为: A 线程写数据,B线程读取数据,但是读操作与写操作没有通过同步排序导致异常的结果。
JMM 对正确同步的程序作了如下保证: 如果程序是正确同步的,那么程序执行的顺序将具有顺序一致性,也就是说该程序的执行结果与该程序在顺序一致性模型中执行的结果一致。
2、数据一致性的内存模型
顺序一致性内存模型是一个被计算机科学家理想化了的理论参考模型,它为程序员提供了极强的内存可见性保证。
顺序一致性内存模型有两大特性:
- 一个线程中的所有操作必须按照程序的顺序来执行
- 所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见
顺序一致性内存模型对外提供的等效模型图如下图所示:
在示意图中,顺序一致性模型有一个单一的全局内存(主内存),这个内存通过一个左右摆动的开关可以连接到任意一个线程,同时每一个线程必须按照程序的顺序来执行内存读/写操作。从上面的示意图可以看出,在任意时间点最多只能有一个线程可以连接到内存。当多个线程并发执行时,图中的开关装置能把所有线程的所有内存读/写操作串行化(即在顺序一致性模型中,所有操作之间具有全序关系)。
3、总结
总的来说,顺序一致性模型就是一种实现了各个线程之间同步操作的一种模型,他能够保证符合该模型的程序线程的操作立刻对其他线程可见。JMM在对一些具有同步原语的操作,比如volatile,final操作的时候都会具有顺序一致性的效果。