java内存模型

2020-04-02  本文已影响0人  凌晨的咸鱼
先来了解现代计算机硬件体系
  1. 总线加锁(此方法性能较低,现在已经不会再使用)
  2. MESI协议
    这是Intel提出的,MESI协议也是相当复杂,在这里我就简单的说下:当一个CPU修改了Cache中的数据,会通知其他缓存了这个数据的CPU,其他CPU会把Cache中这份数据的Cache Line置为无效,要读取数据的话,直接去内存中获取,不会再从Cache中获取了。(java中的volatile关键字)
    当然还有其他的解决方案,MESI协议是其中比较出名的。
Java线程与硬件处理器

我们在Java中开启一个线程,最终Java也会交给CPU去执行。
具体的流程是:我们在使用Java线程,内部会调用操作系统(OS)的内核线程(Kernel-Level Thread),这种线程是操作系统内核(Kernel)直接支持的,内核通过调度器,对线程进行调度,并将线程交给各个CPU内核去处理。

如下图所示:java线程 — 操作系统线程 — CPU

image.png
JAVA内存模型

Java内存模型是一个抽象的概念,其实并不存在,它描述的是一种规范,这个规范可以这样解释:每个线程都有自己的工作内存,工作内存中保存的是主存中某些变量的拷贝,线程对变量的所有操作都必须在工作内存中进行,而不能直接读写主内存中的变量。线程之间无法直接访问对方的工作内存中的变量,线程间变量的传递均需要通过主内存来完成。


image.png

Java内存模型中不管是本地内存,还是主内存的数据,最终都会存储在CPU(更准确的来说 是寄存器)、Cache、内存上。所以,java中的线程对应到CPU,主内存(也叫堆内存或共享内存)对应到计算机的内存,本地内存对应到高速缓存,中间通过操作系统进行调度

一句话:Java内存模型就是为了对应计算机cpu,缓存,内存,从而解决多线程对共享数据的读写一致性问题。

上一篇 下一篇

猜你喜欢

热点阅读