Sequential Consistency一致性

  掌握了Sequential Consistency一致性模型之后,我们重新审视一下java的并发。

  我们已经说过,Sequential Consistency只保留进程本地顺序。上文中我们了解到,由于CPU指令重排序、内存多级缓存不一致等问题,硬件层次没有提供Sequential Consistency,需要软件开发人员实现。下面我们就来看一下,在java中如何实现Sequential Consistency。

  Java中Sequential Consistency的基础,是JVM的happens-before关系。在Java Language Specification的内存模型中,规定了happens-before关系,正确处理happens-before关系,是java语言正确实现并发的基础。显而易见的是,在同一个线程的代码中,前面的action happens-before 后面的action。然而它后面又说,两个action就算有happens-before关系,在实现中也不一定按照这个顺序发生。重新排序后的顺序只要能产生合法的结果,就可以接受。

  

  注意,这里说的是“合法”的结果,并不代表这个“合法”的结果符合你的预期。

  更确切的说,两个action如果有happens-before关系,对于和它们没有happens-before关系的代码来说,它们不一定按照这个顺序发生。

  举个例子,对于同时访问数据的两个线程来说,一个线程里的写操作在另一个线程里的读操作看来,有可能是

  

  举个例子来看一下吧。假设两个线程X和Y能共同访问两个变量A和B,A和B初始值为0。

  在X线程中执行

  

  在Y线程中同时读取A和B(实际上java中没法同时原子性的读取两个变量,我们可以先读取B,再读取A),那么有没有可能读取到B=5,A=0呢?直觉上来看,是不可能的。因为X先更新A,后更新B,如果B都读取到了5,那A应该也是5才对。

  

  但是java内存模型明确指出,这种情况是有可能的。因为某个编译器认为

  

  

  也没有什么区别嘛,所以先执行哪个也没关系,所以大刀阔斧的调换了顺序。

  

  所以为了得到需要的结果,在编程时需要建立正确的happens-before关系。建立的方法,可以参考java语言规范。

  比如java语言规范就规定了对volatile字段的写入,happens-before后续对该字段的读取。happens-before关系确定以后,不仅让volatile字段的值让所有线程立即可见,还限制了对该字段访问操作的reorder。

?

原文地址:https://www.cnblogs.com/qfjavabd/p/10938275.html

时间: 2024-11-01 00:19:46

Sequential Consistency一致性的相关文章

一致性模型之Sequential Consistency

Sequential Consistency的定义 Sequential Consistency的精确定义来自于Leslie Lamport老哥(以后我们会多次提到他). 他本来是定义了基于共享内存的多CPU并行计算的一致性模型,但是也可以推广到分布式系统中,实际上多CPU并行计算也都可以认为是分布式系统. 模型的定义是 the result of any execution is the same as if the operations of all the processors were

Sequential consistency

Sequential consistency is one of the consistency models used in the domain of concurrent computing (e.g. in distributed shared memory, distributed transactions, etc.). It was first defined as the property that requires that "... the result of any exe

存储一致性模型研究——Research of Memory Consistency Model

一致性模型: 所谓存储一致性模型(Memory Consistency Model),实际上是系统设计者与应用程序员之间的一种约定.如果应用软件遵从一定的规则访问虚内存系统,则应用软件可获得正确的存储访问结果:反之,若破坏约定的规则,则存储访问的正确性不受保证. 从某种意义上来讲,存储一致性模型对共享存储系统中多处理机的访存次序作了限制,从而对性能有影响.分布式共享存储系统(DSM)的一个根本目标就是让一个通过局域网连接起来的工作站集群,共享单一的分页虚地址空间,使在工作站集群之上运行程序的效果

一致性模型(consistency model)

比如下面的例子: 一行X值在节点M和节点N上有副本 客户端A在节点M上写入行X的值 一段时间后,客户端B在节点N上读取行X的值 一致性模型所要做的就是决定客户端B能否看到客户端A写的值.一致性模型分为一下几种模型: 随意一致性(causal consistency) delta一致性(delta consistency) entry一致性(entry consistency) 最终一致性(eventual consistency) 创建一致性(fork consistency) 原子一致性(at

内存一致性模型(Memory Consistency Models)

译注:计算机早已进入了多核时代,多核时代要求程序员能够编写并行的程序来充分发挥多处理器的功效.而编写并行/并发程序必须要对内存模型有所了解.因此本人特翻译了一篇有关内存模型综述性质的文章.初次翻译文章,错误在所难免,还望指教.原文地址:http://www.cs.nmsu.edu/~pfeiffer/classes/573/notes/consistency.html 注:有一个很好的关于内存一致性模型的教程在 ftp://gatekeeper.dec.com/pub/DEC/WRL/resea

数据一致性(consistency)、服务可用性(availability)、分区容错性(partition-tolerance)

分布式系统理论基础 - CAP 2016-04-04 18:27 by bangerlee, 135 阅读, 0 评论, 收藏, 编辑 引言 CAP是分布式系统.特别是分布式存储领域中被讨论最多的理论,“什么是CAP定理?”在Quora 分布式系统分类下排名 FAQ 的 No.1.CAP在程序员中也有较广的普及,它不仅仅是“C.A.P不能同时满足,最多只能3选2”,以下尝试综合各方观点,从发展历史.工程实践等角度讲述CAP理论.希望大家透过本文对CAP理论有更多地了解和认识. CAP定理 CAP

内存一致性模型

Cache coherence 本文主要讨论的是内存一致性问题(memory consistency),和缓存一致性(cache coherence)是不同的.在<计算机体系结构:量化方法研究>第五章中,memory consistency是由cache coherence引出的,所以我们就先来说说cache coherence吧.考虑下图: 如图,A和B读取X到缓存后,A直写(write through)X的值为0,但此时B缓存中存储的X的值仍然是1.即如果此时B读取X,将会收到数值1! 通

zt:缓存一致性(Cache Coherency)入门 cach coherency

http://www.infoq.com/cn/articles/cache-coherency-primer http://www.cnblogs.com/xybaby/p/6641928.html 本文是RAD Game Tools程序员Fabian “ryg” Giesen在其博客上发表的<Cache coherency primer>一文的翻译,经作者许可分享至InfoQ中文站.该系列共有两篇,本文系第一篇. 我计划写一些关于多核场景下数据组织的文章.写了第一篇,但我很快意识到有大量的

缓存一致性

多核处理器的基本架构 缓存(Cache) 本文是关于CPU缓存的快速入门.我假设你已经有了基本概念,但你可能不熟悉其中的一些细节.(如果你已经熟悉了,你可以忽略这部分.) 在现代的CPU(大多数)上,所有的内存访问都需要通过层层的缓存来进行.也有些例外,比如,对映射成内存地址的I/O口.写合并(Write-combined)内存,这些访问至少会绕开这个流程的一部分.但这两者都是罕见的场景(意味着绝大多数的用户态代码都不会遇到这两种情况),所以在本文中,我将忽略这两者. CPU的读/写(以及取指令