顺序一致性和线性一致性

首先要知道线性一致性是更早出现的,问题在于解决多核计算机多线程得内存可见性问题。

顺序一致性则是线性一致性的升级

顺序一致性
任意一种可能的执行的结果和某一种所有的处理器的操作按照顺序排列执行的结果是一样的,并且每个独立的处理器的操作都会按照程序指定的顺序出现在操作队列中。

假设线程p1的执行顺序为A->B->C

线程p2的执行顺序为D->E->F

顺序保证性可以保证其他的所有线程见到的顺序是这两个线程指定的顺序。

可能是D->E->F->A->B->C

也可能是A->D->B->E->C->F

这都是满足顺序一致性的,因为每个线程的顺序没变。

线性一致性

满足了线性一致性就也满足了顺序一致性

线程一致性也称

  1. 原子一致性
  2. 强一致性

为什么说满足了线性一致性就满足了顺序一致性?

如果说顺序一致性只保证单节点事件先后顺序的话,线性一致性还保证节点间的事件先后顺序。

即上面的例子中假设p1先执行,p2后执行

那么事件的执行顺序就只能是A->B->C->D->E->F

顺序一致性和线性一致性导致的区别

在这里插入图片描述

假设这分别是p1 和p2的执行顺序

  • 如果只满足顺序一致性,那么可能的顺序就是Read(a),Write(a,2),read(b),Write(b,2);

    因为只要满足write(a,2)在read(b)之前,以及Read(a)在write(b,2)之前

  • 如果满足线性一致性,那么保证的就是Write(a,2),read(a),Write(b,2),read(b);

这样满足顺序一致性的读到的都是初始值0,而满足顺序一致性的可以满足读到a的值为2,b的值为2.

为什么说zookeeper的写是线性一致性,而读写时顺序一致性?

因为zk的写操作是通过一个FIFO队列实现顺序的,所以每个操作都是有顺序的。

但是写操作则不能保证,因为zk中有些节点可能没有读到最新的数据,但是如果是对于他自己这个节点来说,他自己所有的读写操作是顺序的。但是如果加了sync是可以保证线性一致性的,因为可以刷回最新的数据在读。

自己这个节点来说,他自己所有的读写操作是顺序的。但是如果加了sync是可以保证线性一致性的,因为可以刷回最新的数据在读。

是否我们就可以认为,线性一致性是全局的顺序一致性呢?
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐