JAVA-JVM-内存模型

1.简单的缓存模型:

早期,CPU要读取数据,需要先把数据从硬盘加载到RAM,主内存中,CPU再从主内存中读取数据,但是CPU与主内存之间的运行速度相差越来越大。为解决两者之间的差距,在CPU和RAM之间加了一层 CPU缓存(CPU高速缓存),CPU高速缓存的运行速度跟CPU差不多,在运算过程中,会把数据加载到CPU高速缓存中,CPU再从高速缓存中读取数据,来解决CPU与主内存之间的差距。
在这里插入图片描述
在这里插入图片描述

2.复杂版

在这里插入图片描述

3.JMM内存模式:

JAVA多线程内存模型跟CPU缓存模型类似,是基于CPU缓存模型来建立的,Java线程内存模型是标准化的,屏蔽掉了底层不同计算机的区别
在这里插入图片描述

如上图所示:
当线程1和线程2都操作同一个共享变量时,线程中会有一块类似于CPU高速缓存的工作内存,在运行中,线程会先把数据读取到工作内存中,创建一个共享变量副本。
但是以上会存在一个问题,当线程1和2同时读取了同一个共享变量int a = 6
,但是当线程1把a变为7时,线程2并不知道,因为线程2始终读取的是自己的工作内存,这样就有可能造成不同线程中,数据不同步,最终回写给主内存的值也是不正确的。

代码实例: 线程1:读取flag,while时,进行循环 线程2:更改flag
结果:线程1一直时死循环,因为并没有拿到新的flag的值,并不能跳出死循环

public class VolatileVisibilityTest {
    private static boolean flag = true;
    public static void main(String[] args) throws InterruptedException {
        new Thread(()->{
            System.out.println("Thread One .......start");
            while (flag){
            }
            System.out.println("Thread One ......end");
        }).start();

        Thread.sleep(2000);

        new Thread(()->{
            startThreadTwo();
        }).start();
    }
    public static void startThreadTwo(){
        System.out.println("Thread Two ......start");
        flag = false;
        System.out.println("Thread Two ......end");
    }
}

结果:
在这里插入图片描述

解决方案:如果想跳出死循环,关键字volatile能起到作用

在这里插入图片描述

关键字volatile的作用:
1.保证了不同线程对该变量操作的内存可见性;
2.禁止指令重排序

解释:

JMM的原子操作都有哪些?
在这里插入图片描述
在这里插入图片描述

如上图:为读取数据,并运算使用,最后写入回主内存的过程
读取:线程2从主内存中读取数据 initflag = false
载入:将读取到的数据加载到工作内存中 使用:线程从工作内存中读取数据
使用:线程2从工作内存中获取数据
赋值:线程改变工作内存中数据 initflag = true
存储:将工作内存中的数据存储到主内存,此时并没有真正改变主内存中的值
写入:将数据 initflag = true真正写入到主内存中,改变数据

在以上步骤中,在有volatile关键字时,是要求有4步骤数据赋值后,要求线程把数据立马进行 5 6 操作,写回主内存中。
在以上图中,在CPU和主内存中间,还有一个总线,其中总线中有 MESI
缓存一致性协议,缓存一致性协议中。其中要求当某个CPU进行了写入操作时,会通过总线嗅探机制来监听,一但监听到,其他CPU会将自己内存中的相关变量置为无效,这样当再次拿去工作内存中的数据时,会发现数据已经无效,需要从主内存中重新读取值,获取正确的数据

4.JMM缓存不一致问题:

在这里插入图片描述

5.volatile底层实现:

在volatile关键字执行的汇编语言中,其汇编语言语句头部会有一个 lock前缀指令,lock要求即:
1.将当前处理器缓存行的数据立即写回到系统内存
2.这个写回内存的操作会引起其他CPU里缓存了该内存地址的数据无效(MESI)
3.提供内存屏障功能,使lock前后指令不能重新排序

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值