JVM 之java内存模型
一、硬件的效率与一致性在计算机中处理器是用来处理任务的 , 而内存是用来存储数据的 , 计算器处理任务仅仅靠处理器是无法完成任务的 , 通常需要读取内存数据 , 处理器处理完后 , 再把处理结果保存到内存中 。 由于计算机的处理速度和存储速度有几个数量级的差距 , 所以计算机不得不加入一层速度更加接近处理器处理速度的高速缓存作为内存与处理器之间的缓冲 。 计算机把数据从内存复制到缓存中 , 使用处理器处理完毕后 , 再把处理后的数据同步到内存中 。
【JVM 之java内存模型】 但是在多个处理器中就会存在多个缓存 , 但是多个处理器又公用一个内存 。 当多个处理器处理数据涉及同一块主内存区域 , 可能会导致每个处理器的缓存数据不一致 。 为了解决这个问题 , 就要通过一些协议来解决缓存一致性 。
文章插图
二、java内存模型 java内存模型规定了所有的变量都存在主内存中(虚拟机内存的一部分和硬件的主内存重名) , 每个线程还有自己的工作内存 , 工作内存中保存了每个线程自己需要的主内存中的数据 , 每个线程执行完成后 , 再把自己工作内存中的数据同步到主内存中 。 线程不能直接操作主内存 , 只能操作为每个线程分配的工作内存 。
文章插图
三、内存间的交互操作java内存模型中定义了8种操作用来进行内存之间的数据拷贝和同步 。 并且这8种操作都是原子性的操作 。
lock(锁定):作用于主内存 , 它把一个变量标记为一条线程独占状态;
read(读取):作用于主内存 , 它把变量值从主内存传送到线程的工作内存中 , 以便随后的load动作使用;
load(载入):作用于工作内存 , 它把read操作的值放入工作内存中的变量副本中;
use(使用):作用于工作内存 , 它把工作内存中的值传递给执行引擎 , 每当虚拟机遇到一个需要使用这个变量的指令时候 , 将会执行这个动作;
assign(赋值):作用于工作内存 , 它把从执行引擎获取的值赋值给工作内存中的变量 , 每当虚拟机遇到一个给变量赋值的指令时候 , 执行该操作;
store(存储):作用于工作内存 , 它把工作内存中的一个变量传送给主内存中 , 以备随后的write操作使用;
write(写入):作用于主内存 , 它把store传送值放到主内存中的变量中 。
unlock(解锁):作用于主内存 , 它将一个处于锁定状态的变量释放出来 , 释放后的变量才能够被其他线程锁定;
除了这8个原子性操作 , 还必须满足如下规则:
(1)不允许read和load、store和write操作之一单独出现(即不允许一个变量从主存读取了但是工作内存不接受 , 或者从工作内存发起会写了但是主存不接受的情况) , 以上两个操作必须按顺序执行 , 但没有保证必须连续执行 , 也就是说 , read与load之间、store与write之间是可插入其他指令的 。
(2)不允许一个线程丢弃它的最近的assign操作 , 即变量在工作内存中改变了之后必须把该变化同步回主内存 。
(3)不允许一个线程无原因地(没有发生过任何assign操作)把数据从线程的工作内存同步回主内存中 。
(4)一个新的变量只能从主内存中“诞生” , 不允许在工作内存中直接使用一个未被初始化(load或assign)的变量 , 换句话说就是对一个变量实施use和store操作之前 , 必须先执行过了assign和load操作 。
(5)一个变量在同一个时刻只允许一条线程对其执行lock操作 , 但lock操作可以被同一个条线程重复执行多次 , 多次执行lock后 , 只有执行相同次数的unlock操作 , 变量才会被解锁 。
(6)如果对一个变量执行lock操作 , 将会清空工作内存中此变量的值 , 在执行引擎使用这个变量前 , 需要重新执行load或assign操作初始化变量的值 。
推荐阅读
- 手机内存不足别乱删,学会这5个技巧,让手机释放大量空间
- 计算机专业大一下学期,该选择学习Java还是Python
- Intel 11代酷睿逼近7GHz!内存超至6666.66MHz
- 内存大厂跨界之作!芝奇Enki 360一体式水冷评测:高密度冷排稳压18核心
- 未来想进入AI领域,该学习Python还是Java大数据开发
- 旗舰|OPPO Find X3曝光:骁龙888/12G内存
- 威刚为英特尔12代Alder Lake平台准备了64GB DDR5-8400内存模组
- 曝Redmi Note 10 Pro获认证:8GB内存
- 学习大数据是否需要学习JavaEE
- 三星让渡部分DRAM产能:内存价格或暴涨