内存模型
为了应用程序能够避免数据竞争的干扰,java5引入了明确定义的java内存模型,其中最重要的一个概念就是happens-before关系,happens-before关系是用来描述两个操作的内存可见性的,如果X happens-before 操作Y,那么X的结果对于Y可见。
在同一个线程中,字节码的先后顺序也暗含了happens-before关系:在程序控制流路径中靠前字节码 happens-before 靠后的字节码,然而,并不是前者一定在后者之前执行,实际上,如果后者没有观测前者的运行结果,即后者没有数据依赖于前者,那么它们可能被重排序。
线程间的happens-before关系:1,2,3,4,5,6(todo)
具备传递性,如果X happens-before 操作Y,而操作Y happens-before 操作Z,那么操作X happens-before 操作Z。
如果两次赋值操作之间没有数据依赖,即时编译器、处理器可以对其进行重排序。如何解决指令重排序的问题,为a,b字段设置volatitle字段。
java内存模型的底层实现
通过内存屏障来禁止指令重排序。
例如volatitle字段,所插入的内存屏障不允许volitatile字段写操作之前的内存访问被重排序到他的后面,也不允许volatile字段读操作之后的内存访问被重排序至其之前。
未完待续。。。
锁,volatile字段,final字段与安全发布
final实例字段涉及新建对象的发布问题,当一个对象包含final实例字段时,我们希望其他线程只能看到已初始化的final实例字段。因此即时编译器会在final字段的写操作后插入一个写写屏障,以防某些优化将新建对象的发布重排序 到 该字段的写操作之前。