顺序一致性内存模型是一个被计算机科学家理想化了的理论参考模型,它为程序员提供了极强的内存可见性保证。顺序一致性内存模型有两大特性。
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不保证所有线程
能看到一致的操作执行顺序。
3)JMM不保证对64位的long型和double型变量的写操作具有原子性,而顺序一致性模型保
证对所有的内存读/写操作都具有原子性。