Java程序的 内存可见性保证 可以分为下列3类
1)单线程程序
单线程程序不会出现内存可见性问题。
编译器、runtime、处理器会共同确保单线程程序的执行结果与该程序在顺序一致性模型中的执行结果相同。
2)正确同步的多线程程序
正确同步的多线程程序的执行将具有顺序一致性。
Further Reading :JMM对正确同步的多线程程序的内存一致性的保证
顺序一致性(程序的执行结果与该程序在顺序一致性内存模型中的执行结果相同)
JMM通过限制编译器和处理器的重排序来为程序员提供内存可见性保证。
3)未同步/未正确同步的多线程程序
对于未同步或未正确同步的多线程程序,JMM不保证执行结果与该程序在顺序一致性模型中的执行结果一致,JMM只提供最小安全性保障
。线程执行时读取到的值,要么是之前
某个线程写入的值,要么是默认值
(0,Null,False),JMM保证线程读操作读取到的值不会无中生有(Out Of Thin Air)的冒出来。
为了实现最小安全性,JVM在堆上分配对象时,首先会对内存空间进行清零
,然后才会在上面分配对象(JVM内部会同步这两个操作)。因此,在已清零的内存空间(Pre-zeroed Memory)分配对象时,域的默认初始化
已经完成了。
-----------------------------------------------------------------------------摘自 书名:Java并发编程的艺术 作者:方腾飞;魏鹏;程晓明