如果程序是正确同步的,程序的执行将具有顺序一致性(Sequentially Consistent)——即程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同。
同步,即排队。
同一时刻,只能有一个线程和内存交互!!
顺序一致性内存模型两大特性
-
一个线程中的所有操作必须按照程序的顺序来执行。
-
(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见。
下面这个栗子说明,不管多个线程间的操作如何交叉,单线程内的执行顺序是不变的。
同步程序的顺序一致性效果
当writer()方法让出CPU,但是其内部操作没有执行完,意味着还没有释放锁;此时,即便reader()方法得到了CPU的位置,但还是无法使用,因为锁未被释放。
未同步程序的顺序一致性效果
线程执行时读取到的值,要么是之前某个线程写入的值,要么是默认值(0,Null,False),JMM保证线程读操作读取到的值不会无中生有(Out Of Thin Air)的冒出来。
JMM不保证对64位的long型和double型变量的写操作具有原子性,而顺序一致性模型保证对所有的内存读/写操作都具有原子性。
原因是:超过总线宽度的,对内存的操作就要分两次,可能保证不了原子性。
数据通过总线在处理器和内存之间传递。每次处理器和内存之间的数据传递都是通过一系列步骤来完成的,这一系列步骤称之为总线事务(Bus Transaction)。 总线事务包括读事务(Read Transaction)和写事务(Write Transaction)。读事务从内存传送数据到处理器,写事务从处理器传送数据到内存,每个事务会读/写内存中一个或多个物理上连续的字。