Java并发基础-顺序一致性

一、重排序

重排序是指编译器和处理器为了优化程序性能而对指令序列进行重新排序的一种手段。

数据依赖性:如果两个操作同访问一个变量,且这两个操作中有一个操作为写操作,此时这两个操作之间就存在数据依赖性。

as-if-serial语义:不管怎么重排序(编译器和处理器为了提高并行度),(单线程)程序的执行结果不能被改变。编译器,runtime和处理器都必须遵守as-if-serial语义。

顺序一致性:顺序一致性内存模型是一个理论参考,在设计的时候,处理器的内存模型和编程语言的内存模型都会以顺序一致性内存模型作为参考。

数据竞争定义如下:在一个线程中写一个变量   在另一个线程读一个变量    而且写和读没有通过同步来排序

JMM对正确同步的多线程程序的内存一致性作了如下保证。

如果程序是正确同步的,程序的执行将具有顺序一致性即程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同。这里的同步是指广义上的同步,包括对常用同步原语(synchronized、volatile和filnal)的正确使用。

顺序一致性内存模型:

1)一个线程中的所有操作必须按照程序的顺序来执行。

2)(不管程序是否同步)所有线程只能看到一个单一的操作执行顺序。在顺序一致性内存模型中,每个操作都必须原子执行且立即对所有线程可见。

扫描二维码关注公众号,回复: 3459827 查看本文章

未同步程序在两个模型中的执行特性有以下几个差异:

1)顺序一致性模型保证单线程内的操作会按程序的顺序执行,而JMM不保证单线程内的操作会按程序的顺序执行

2)顺序一致性模型保证所有线程只能看到一致的操作执行顺序,而JMM不保证所有线程能看到一致性的操作执行顺序

3)JMM不保证对64位的long和double型变量的写操作具有原子性,而顺序一致性模型保证对所有的内存读/写操作都具有原子性。

猜你喜欢

转载自blog.csdn.net/cclliii/article/details/82823556