3.3 顺序一致性
3.3.1 数据竞争与顺序一致性
JMM对正确同步的多线程程序的内存一致性做了如下的保证:
如果程序是正确同步的,程序的执行将具有顺序一致性(Sequentially Consistent)—— 即程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同。
3.3.2 顺序一致性内存模型
- 一个线程中的所有操作必须按照程序的顺序来执行
- (不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。
假设两个线程A和B并发执行,各自有3个操作,A线程的3个操作在程序中的顺序是:A1 -> A2 -> A3,B线程为:B1 -> B2 -> B3。
第一种情况:假设两个线程使用监视器锁来正确同步:
第二种情况:假设两个线程没有进行同步:
3.3.3 同步程序的顺序一致性效果
class SynchronizedExample(){
int a = 0;
boolean flag = false;
public synchronized void writer(){ //获取锁
a = 1;
flag = true;
} //释放锁
public synchronized void reader(){ //获取锁
if(flag){
int i = a;
....
} //释放锁
}
}
下面是该程序在两个内存模型中的执行时序对比图:
3.3.4 未同步程序的执行特性
对未同步或未正确同步的多线程程序,JMM只提供最小安全性:线程执行时读取到的值,要么是在之前某个程序写入的值,要么就是默认值(0,Null, False ),JMM保证线程读操作读取到的值不会无中生有的冒出来。