Java并发学习之java内存模型JMM

感觉还是要从java内存模型开始。

在这个之前先介绍一下MESI。

用于保证多个CPU cache 之间缓存的一致性。

M:被修改 该缓存行只被缓存在该CPU中 被修改过 与主存数据不一致 写回主存变成E (独享) 

E:独享  缓存行只被缓存在该CPU缓存中 未被修改过 与主存一致  线程读取成为S  如果修改成为M(修改)

S:共享  该缓存行可能被多个CPU缓存  各个缓存与主存一致 当有一个CPU修改 其他CPU将缓存行变为I(失效)

I:无效的 

也帮自己在梳理下,JMM:Java Memory Model。

JMM 是一种规范,规范了java虚拟机与计算机内存是如何协同工作的,规定了一个线程如何和何时可以看到其他线程修改过后共享变量的值以及在必须时如何同步的访问共享变量。


Java并发学习之java内存模型JMM_第1张图片
图一

首先大家都知道 堆和栈的存在。

堆和栈中到底用来干嘛?存取哪些东西?

此处上链接:JAVA中的栈和堆  (贴出来的链接都是我认为不错的也可以参考其他)

还是图一我们可以看到MethodOne()中两个本地变量指向了同一个堆中变量 堆中对象则被拷贝成了两个私有拷贝。(由此可以得出Object 为非线程安全的变量 比如 HashMap等),methodTwo()这个就好理解了,Object1与Object5为线程安全的(比如:Hashtable)

图一右侧可以根据MESI来做解释。 两个CPU中都有一个线程,请求CPU缓存,可以看到CPU这个时候可能修改了某个值,根据MESI上面写的 修改以后刷入主存 成为E独享状态。

当修改一个CPU缓存行的东西另外一个CPU此缓存行将失效,重新更新缓存行。


Java并发学习之java内存模型JMM_第2张图片
图二

lock(锁定):作用于主内存的变量,把一个变量标识为一条线程独占状态。

unlock(解锁):作用于主内存变量,把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定。

read(读取):作用于主内存变量,把一个变量值从主内存传输到线程的工作内存中,以便随后的load动作使用

load(载入):作用于工作内存的变量,它把read操作从主内存中得到的变量值放入工作内存的变量副本中。

use(使用):作用于工作内存的变量,把工作内存中的一个变量值传递给执行引擎,每当虚拟机遇到一个需要使用变量的值的字节码指令时将会执行这个操作。

assign(赋值):作用于工作内存的变量,它把一个从执行引擎接收到的值赋值给工作内存的变量,每当虚拟机遇到一个给变量赋值的字节码指令时执行这个操作。

store(存储):作用于工作内存的变量,把工作内存中的一个变量的值传送到主内存中,以便随后的write的操作。

write(写入):作用于主内存的变量,它把store操作从工作内存中一个变量的值传送到主内存的变量中。

在此之前看到MESI的图我还是有点懵的,这里没贴出来有兴趣的可以看下https://blog.csdn.net/realxie/article/details/7317630(MESI-CPU缓存一致性协议)

看到图二就知道在这个过程中到底CPU去做了什么。


本文仅限本人小白学习参考,不足之处请大佬指正。

你可能感兴趣的:(Java并发学习之java内存模型JMM)