Java并发-顺序一致性模型

顺序一致性模型

顺序一致性内存模型有两大特性
1)一个线程中的所有操作必须按照程序的顺序来执行。
2)(不管程序是否同步)所有线程都只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立刻对所有线程可见
这里写图片描述

在概念上,顺序一致性模型有一个单一的全局内存,这个内存通过一个左右摆动的开关可以连接到任意一个线程,同时每一个线程必须按照程序的顺序来执行内存读/写操作。在任意时间点最多只能有一个线程可以连接到内存。

假设两个线程A,B并发执行,其中A线程有3个操作,它们在程序中的顺序是:A1-A2-A3。其中B线程也有3个操作,它们在程序中的顺序是:B1-B2-B3。

假设两个线程使用监视器锁来正确同步:
这里写图片描述

假设这两个线程没有做同步:
这里写图片描述

在JMM中就没有这个保证。未同步程序在JMM中不但整体的执行顺序是无序的,而且所有线程看到的操作执行顺序也可能不一致。

顺序一致性模型与JMM的区别

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

这3个差异与处理器总线的工作机制密切相关。
总线事务包括读事务和写事物。读事务从内存传递数据到处理器,写事务从处理器传送数据到内存。每个事物会读/写内存中一个或多个物理上连续的字。在一个处理器执行总线事物期间,总线会禁止其他的处理器和I/O设备执行内存的读/写。
这里写图片描述

假设处理器A,B,C同时向总线发起总线事务,只是总线仲裁会对竞争做出裁决,这里假设总线在仲裁后判定处理器A在竞争中获胜。此时处理器A继续它的总线事物,而其他两个处理器则要等待处理器A的总线事务完成后才能再次执行内存访问。期间不管总线事物是读事务还是写事物。
总线的这些工作机制可以把所有处理器对内存的访问以串型化的方式来执行。在任意时间点,最多只能有一个处理器可以访问内存。这个特性确保了单个总线之中的内存读/写操作的原子性。

猜你喜欢

转载自blog.csdn.net/qq_29842929/article/details/80793341