C轮融资|java内存模型之概览

C轮融资|java内存模型之概览

文章图片


一:概念
很多人会混淆【Java内存结构】和【java内存模型】 , 它们之间基本上是没有什么关系的 。
【java内存模型】的英文全称是Java Memory Model , 简称JMM 。 简单来说 , JMM定义了一套在多线程存在共享数据(类的成员变量、数组等)的情况下 , 对共享数据的原子性、可见性、有序性的规则和保障 。
二:硬件的效率和一致性
现在的电脑的CPU几乎都是多核的 , 同时处理多个任务也是现代操作系统的一个必备功能 。 在说JMM之前 , 我们先思考下CPU是如何处理并发问题的呢?它的结构是怎样的呢?
绝大多数的计算机任务 , 不能只靠处理器“计算”完成 , 还需要数据的读取和运算结果的保持 , 那就绕不开要对磁盘进行IO操作 。 但是磁盘IO于处理器的运算速度有好几个数量级的差距 。
所以现代计算机就加了一层或者几层的高速缓存 , 作为内存和处理间的缓冲 , 也就是说把处理器需要的数据复制到高速缓存中 , 让计算快速运行 , 之后再把计算结果从高速缓存中同步到内存中 , 这样就不需要等待缓慢的内存读写了 。
高速缓存解决了处理器和内存之间处理速度的矛盾 , 但是又引入了一个新的问题那就是:缓存一致性问题 。
现在的电脑几乎都是多个处理器 , 每个处理器都有自己的告诉缓存 , 但是这多个处理器共享同一主内存 。 如果多个处理器上的计算任务需要读写同一块内存区域时 , 就会出现各处理器的高速缓存中的数据不一致问题 。 为了解决这个问题 , 各个处理器访问主内存时 , 必须遵守缓存一致性协议 。

图片来自《深入理解Java虚拟机》一书
二:Java内存模型
JMM规定了所有的变量都存在主内存中 , 这里说的变量不包括方法的局部变量 , 因为它是线程私有的 , 不存在共享 , 那也就不存在数据竞争 。
每个线程有自己的工作内存(类似处理器的高速缓存) , 线程的工作内存中保存着该线程使用的变量的主内存副本 , 线程对变量的所有操作都在工作内存中完成 , 不能直接操作主内存 。
不同线程之间也不能访问对方的工作内存中的变量 , 线程间变量值的传递只能通过主内存完成 。

深入理解Java虚拟机
JMM中的工作内存 , 主内存和Java内存结构中的堆、栈、方法区中根本就是在不同维度上的划分 , 它们之间可以说没有什么关系 。
【C轮融资|java内存模型之概览】如果要勉强对应的话 , 主内存主要对应于Java堆中的对象实例数据部分 , 而工作内存 则对应于虚拟机栈中的部分区域 。