Java多线程 JMM抽象: 主内存和本地内存

JMM抽象: 主内存和本地内存概念

JMM屏蔽了底层细节, 定义了一套读写内存数据的规范, 不再需要关心一级缓存二级缓存的问题,
抽象了主内存和本地内存的概念.

本地内存并不是真的给每一个线程分配内存, 而是JMM的一个抽象, 是对于寄存器, 一级缓存, 二级缓存 三级缓存的抽象.
即下图中的这些缓存, 不用管独享的是哪一部分, 共享的是哪一部分. JMM帮我们抽象成了主内存和本地内存这两部分.

如下图所示, 每一个Thread假设代表一个CPU. 每一个CPU获取的数据从各自的Working Memory即工作内存中获取, 每个线程的工作内存的数据是不互通的. 每一个线程只能是通过一个Buffer与Main Memory主内存去互通数据的.
JMM通过这种抽象成2层的概念, 既能提高程序的运行速度(保留了线程之间各自的缓存) , 也降低了开发者的开发难度 , 使得开发者在处理并发问题的时候, 不需要去考虑cpu与主内存之间五层缓存的复杂问题.

下图也是同样的道理 . 线程之间数据的操作, 都要经过主内存, 各个线程都有各自的工作内存.

主内存和本地内存的关系

JMM规定的主内存和本地内存的关系

  1. 所有的变量都存储在主内存中, 同时每个线程也有自己独立的工作内存, 工作内存中所有的变量内容都是主内存的拷贝.
  2. 线程不能直接读写主内存中的变量, 而是只能操作自己工作内存中的变量, 再同步到主内存中 . 即在修改变量之前, 要先执行第一步规定的,把数据拷贝到工作内存中再修改, 再同步.
  3. 主内存是多个线程共享的 , 但线程间不共享工作内存, 如果线程间需要通信, 必须借助主内存中转来完成.

总结: 所有的共享变量, 是存在于主内存中的, 每个线程有自己的本地内存, 而且线程读写共享数据也是通过本地内存交换的,正是由于有交换的过程, 并且这个交换不是实时的, 所以才导致了可见性的问题.

猜你喜欢

转载自blog.csdn.net/qq_33229669/article/details/108422267