顺序一致性模型

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

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

JMM保证如果程序是正确同步的,程序的执行将具有顺序一致性,即程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同。

而对于未同步或未正确同步的多线程程序,JMM只提供最小安全性:线程执行时读取到的值要么是之前某个线程写入的值,要么是默认值(0,null,false),JMM保证线程读操作读取到的值不会无中生有的冒出来。为了实现最小安全性,JVM在堆上分配内存时,首先会对内存空间进行清零,然后才会在上面分配对象(JVM内部会同步这两个操作)。

注意:对于未同步程序,JMM不保证对64位的long型和double型变量的写操作具有原子性。

happens-before

happens-before原则定义如下:

  1. 如果一个操作happens-before另一个操作,那么第一个操作的执行结果将对第二个操作可见,而且第一个操作的执行顺序排在第二个操作之前。
  2. 两个操作之间存在happens-before关系,并不意味着Java平台的具体实现一定要按照happens-before原则制定的顺序来执行。如果重排序之后的执行结果与按照happens-before关系来执行的结果一致,那么这种重排序并不非法。

参考资料

  • 《Java并发编程的艺术》