顺序一致性内存模型两大特性
1)一个线程中的所有操作必须按照程序的顺序来执行。
2)(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。 感觉是线程没有本地内存概念,直接读写主存,导致所有线程都可以立刻看到,且有点主线加锁的感觉
顺序一致性内存模型为程序员提供的视图
在概念上,顺序一致性模型有一个单一的全局内存,这个内存通过一个左右摆动的开关可以连接到任意一个线程, 同时每一个线程必须按照程序的顺序来执行内存读/写操作。
同步程序在顺序一致性模型
中的执行示意图
A线程的3个操作执行后释放监视器锁,随后B线程获取同一个监视器锁。那么程序在顺序一致性模型中的执行效果将如下图所示
未同步程序在顺序一致性模型
中的执行示意图
假设有两个线程A和B并发执行。其中A线程有3个操作,它们在程序中的顺序是:A1→A2→A3。B线程也有3个操作,它们在程序中的顺序是:B1→B2→B3。
未同步程序在顺序一致性模型中虽然整体执行顺序是无序
的,但所有线程都只能看到一个一致的整体执行顺序
。以上图为例,线程A和B看到的执行顺序都是B1→A1→A2→B2→A3→B3。
之所以能得到这个保证是因为。 顺序一致性内存模型中的每个操作必须立即对任意线程可见
但是,在JMM中就没有这个保证。未同步程序在JMM中不但整体的执行顺序是无序的,而且所有线程看到的操作执行顺序也可能不一致。比如,在当前线程把写过的数据缓存在本地内存中,在没有刷新到主内存之前,这个写操作仅对当前线程可见;从其他线程的角度来观察,会认为这个写操作根本没有被当前线程执行。只有当前线程把本地内存中写过的数据刷新到主内存之后,这个写操作才能对其他线程可见。在这种情况下,当前线程和其他线程看到的操作执行顺序将不一致。
顺序一致性内存模型是一个理论参考模型,Java内存模型
和处理器内存模型
在设计时通常会以顺序一致性内存模型为参照。在设计时,JMM和处理器内存模型会对顺序一致性模型做一些放松
,因为如果完全按照顺序一致性模型来实现处理器和JMM,那么很多的处理器和编译器优化
都要被禁止,这对执行性能
将会有很大的影响。
同步程序
Further Reading :JMM对正确同步的多线程程序的内存一致性的保证
未同步程序
Further Reading :JMM的内存可见性保证 之 未同步/未正确同步的多线程程序
未同步程序在两个模型中的执行特性有如下几个差异
1、顺序一致性模型保证
单线程内的操作会按程序的顺序执行,而JMM不保证
单线程内的操作会按程序的顺序执行
2、顺序一致性模型保证
所有线程只能看到一致的操作执行顺序,而JMM不保证
所有线程能看到一致的操作执行顺序。
3、顺序一致性模型保证
对所有的内存读/写操作都具有原子性,而JMM不保证
对64位的long型和double型变量的写操作具有原子性。
-----------------------------------------------------------------------------摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明