顺序一致性内存模型与JMM的“顺序一致性”

  顺序一致性内存模型是一个被计算机科学家理想化了的理论参考模型,它为程序员提供了极强的内存可见性保证。顺序一致性内存模型有两大特性。
1)一个线程中的所有操作必须按照程序的顺序来执行。
2)(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见

设这两个线程使用监视来正确同步A线程的3个操作行后监视,随后B线取同一个监视。 

在顺序一致性模型中的执行顺序:

设这两个线程没有做同步

   JMM中,未同步的程序不但整体执行顺序无序,而且所有线程看到的执行顺序也可能不同。比如对一个普通变量的写操作,在当前线程未把本地缓存数据刷新到主内存当中之前,仅对当前线程可见,其他线程不可见。种情况下,当前线程和其他线程看到
的操作序将不一致。下面举简例对比:
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;
……
} // 释放锁
}
}
执行顺序:

JMM在整体执行顺序上遵循顺序一致性模型(按临界区划分),在临界区内允许重排序。

差异对比:

1序一致性模型保证单线程内的操作会按程序的行,而JMM不保证单线程内的
操作会按程序的行(比如上面正确同步的多线程程序在界区内的重排序)。
2序一致性模型保所有线程只能看到一致的操作序,而JMM不保所有线
能看到一致的操作序。
3JMM不保证对64位的long型和double量的写操作具有原子性,而序一致性模型保
证对所有的内存/写操作都具有原子性。

 

 

原文地址:https://www.cnblogs.com/AmbitiousMice/p/8378209.html