尽管这里存在A happens-before B这一关系,但是JMM并不要求A一定要在B之前执行,仅仅要求A的执行结果对B可见。
即JMM仅要求前一个操作的结果对于后一个操作可见,并且前一个操作按照顺序排在后一个操作之前。
但是若前一个操作放在后一个操作之后执行并不影响执行结果,则JMM认为这并不违法,JMM允许这种重排序。
在一个线程中写一个变量,在另一个线程中同时读取这个变量,读和写没有通过排序来同步来排序,就会引发数据竞争。
数据竞争的核心原因是程序未正确同步。如果一个多线程程序是正确同步的,这个程序将是一个没有数据竞争的程序。
顺序一致性模型只是一个参考模型。
顺序一致性模型特性一个线程中所有的操作必须按照程序的顺序来执行。
不管线程是否同步,所有的线程都只能看到一个单一的执行顺序。
在顺序一致性模型中每个曹祖都必须原子执行且立刻对所有线程可见。
当程序未正确同步会发生什么当线程未正确同步时,JMM只提供最小的安全性,当读取到一个值时,这个值要么是之前写入的值,要么是默认值。
JMM保证线程的操作不会无中生有。为了保证这一特点,JMM在分配对象时,首先会对内存空间清0,然后才在上面分配对象。
未同步的程序在JMM种执行时,整体上是无序的,执行结果也无法预知。位同步程序子两个模型中执行特点有如下几个差异:
顺序一致性模型保证单线程内的操作会按照程序的顺序执行,而JMM不保证单线程内的操作会按照程序的顺序执行
顺序一致性模型保证所有线程只能看到一致的操作执行顺序,而JMM不保证所有线程能看到一致的操作执行顺序
JMM不保证对64位的long和double型变量具有写操作的原子性,而顺序一致性模型保证对所有的内存的读/写操作都具有原子性
参考资料java并发编程的艺术-方腾飞,魏鹏,程晓明著