2020-03-24

上集说到基于MESI缓存一致性协议的Java内存模型JMM,在MESI基础上,为了提升效率,允许指令重排序,但是引入了Java在语义方面的问题。

首先,我们写的Java源码代码生成Java虚拟机可以执行指令序列,需要经历下面几个步骤:

Java程序员会有疑问,我的代码会被重排序,那我要实现的逻辑和预期不一致了?


假如没有JMM,java程序员GG写遇到下面的情况,出现与预期不一致,100%懵逼

情况一:


数据有依赖性:

JMM为java程序员使用的内存模型,在程序员的角度,不管在什么硬件平台执行,结果应该是一致的。

这里,JMM需要通过内存屏障来禁止不同编译器,不同处理器对Java指令的特殊处理,为Java程序员提供一致内存的可见性。(遵循Snoopy协议)

什么情况下JMM会使用内存屏障呢?Store与Load操作之间,全能型屏障,而且大多数处理器都支持

程序员不懂编译器和处理器对程序生成的指令做了哪些优化,JMM又要为程序员们保证内存可见性。需要一套准则来保证,那就是happens-before,这个类似于JMM和Java程序员之前的一种协议。


那么,java程序员只要记住容易理解的happens-before原则,不去理会JMM的具体处理,放心地操控每一种硬件资源。happens-before是JMM的关键,既要程序员要求的可见性,又要减少对硬件资源的束缚。

你可能感兴趣的:(2020-03-24)