0%

一致性系列概述

日常编程中,接触了很多种类的一致性,这里希望把一致性中基本原理与原则做一个总结。

归纳的说,一致性描述的问题是,在什么情况下参与者可以观察到对方的变化,并以怎样的规范才能保证对于临界区的处理可控。即参与者A与B,当A write v时,B何时可以read到v的变化; A write v 与B write v 谁发生在前。编程者须遵循何种规范才能保证对于v的修改是符合意愿的。

一致性从最根本上讲,只包含两个原则:1、可见性原则;2、原子性原则;只要参与者满足上述两种原则同时满足上述两种原则,即可实现一致性保证。

为何称之为原则?主要是因为,参与者都遵守这样的原则之后,才可以使整个系统达到预期的一致性。

上述描述过于抽象,我们拆解一下:

1、可见性原则:
即上述描述的,A write v时,B何时才能观察到。 举个例子, 当参与者是同一个进程中的多个线程时,可见性的表达常用volitale表达,即可见性原则总结为了happen before关系。happen-before则表明A write v happens-before B read v。
可见性保证了什么呢?看个例子

1
2
3
4
5
6
7
8
9
10
11
12
public class Visibility {
static volatile a=0;

public static void main(String[] args) {

//in thread 1
a = 1;

//in thread 2
System.out.printlin(a);
}
}

2、原子性原则:
如上所述,可见性是保证对于一个值v的一致性的最基本且直观的方式,当希望保证对于一组值v1, v2, v3…保证一致性时只满足可见性原则还不够,还需要满足原子性原则。即我们希望能够支持,A write v1, v2, v3…,全部完成后,B read v1,v2,v3…时才可以读到改变。