Java内存模型

什么是Java内存模型

        Java内存模型是一个抽象的概念,它只是一个规定jvm虚拟机与内存之间工作方式的规范,规范了 Java 虚拟机与计算机内存之间是如何协同工作的。简单来说,它规定一个线程何时、如何查看其他线程修改过的数据,以及在必须时如何同步地访问共享变量。    

        Java内存模型中规定所有变量都存储在主内存,主内存是共享内存区域,所有线程都可以访问,但线程对变量的操作(读取赋值等)必须在工作内存中进行,首先要将变量从主内存拷贝的自己的工作内存空间,然后对变量进行操作,操作完成后再将变量写回主内存,不能直接操作主内存中的变量,工作内存中存储着主内存中的变量副本拷贝。

         因此在出现多线程共同修改同一个共享变量的情况下,会出现线程安全问题,JMM的出现就是规范一些行为去解决线程安全问题。

 Java内存模型的必要性

        上面提到过其java内存模型存在的目的是避免一下线程安全问题,具体是哪些问题呢?Java 内存模型存在的原因在于解决多线程环境下并发执行时的内存可见性和一致性问题。

        Java 内存模型通过定义一套规则来规范并限制编译器、运行时以及处理器对内存访问的重排序行为,确保了多线程间的交互具有明确的语义。它规定了共享变量的访问规则提供了 happens-before 原则以及 volatile 关键字、synchronized 等工具来实现内存可见性和一致性的保障,可以依据这些规则来确保代码的正确执行,从而避免由于多线程带来的不确定性和错误。

        因此,如果没有Java内存模型会出现以下俩大问题:

1、CPU与内存一致性问题

2、指令重排序

一致性问题

        由于主内存与 CPU 处理器的运算能力之间有数量级的差距,CPU 将常用的数据放在高速缓存中,运算结束后 CPU 再讲运算结果同步到主内存中,这样就会导致多个线程在进行操作和同步时,导致 CPU 缓存和主内存数据不一致的问题

指令重排序

        由于JIT的存在,会对正常的代码指令顺序进行重排序。

Java内存模型规范内容

        主内存:所有线程共享的内存区域,包括对象、方法等数据

        工作内存:线程私有的内存区域,用于存储主内存的副本数据,线程只能直接操作此区域

        内存间交互操作:读操作将数据从主内存复制到工作内存,写操作将修改后的数据刷新到主内存。

        原子性:JMM规定基本数据类型的读写操作保持原子性

        可见性:JMM为了确保可见性,一个线程修改后的数据(工作内存)必须刷新到主内存

        有序性:JMM保证按代码顺序执行指令

        JMM通过以上规则,提供了一种统一的内存访问方式,使得多线程程序的行为可预测、可理解,并帮助开发者编写正确和高效的多线程代码。开发者可以利用 JMM 提供的同步机制(如关键字 volatile、synchronized、Lock 等)来实现线程之间的同步和通信,以确保线程安全和数据一致性。

happens—before原则

        举个简单的例子:A happens before B,那么这句话的涵义有俩点:一个是A发生在B的前面,因此B读取到的数据是A刷新后的,另一个就是指令重排序不会影响到AB执行发生的顺序了。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值