内存模型的理解

内存模型的理解

为什么有内存模型

  1. 计算器执行指令都是在CPU中执行的,而执行的时候需要和数据打交道,而数据是放在主存中的,也就是计算机物理内存,由于内存速度的写入和读取跟不上CPU的速度,导致CPU每次操作内存都要耗费等待时间。这样就增加了高速缓存,当程序运行过程中,会将运算的数据从主存复制一份到CPU的高速缓存当中,那么CPU计算的时候可以从它的高速缓存读取和写入数据,当运算结束之后,再将高速缓存中的数据刷新到主存当中。随着CPU能力不断提升,一层缓存就慢慢无法满足要求了,就衍发出多级缓存。CPU缓存可以分为一级缓存L1,二级缓存L2,部分高端CPU还有三级缓存,每一级缓存中存储的全部数据都是下一级缓存的一部分。当CPU要读取一个数据时,首先从一级缓存中查找,没有再从二级缓存查找,还是没有就到三级缓存中查找或者内存中查找。
  2. 随着计算机能力的不断提升,开始支持多线程。那么问题来了
    1. 单线程。CPU核心缓存只被一个线程访问。缓存独占,不会出现访问冲突问题
    2. 单核CPU,多线程。任何时候只有一个线程在执行,也不会出现访问冲突
    3. 多核CPU,多线程。每个核都会保留一份主存的缓存,这样可能出现多个线程同时写各自缓存的情况,而各自缓存之间的数据就可能不同。
  3. 这样在CPU和主存之间增加缓存,多线程场景下就可能存在缓存一致性的问题,也就是说多核CPU中,每个核的自己缓存中,关于同一个数据缓存的内容可能不一致。
  4. 除了这种情况,还有一种硬件问题也比较重要,那就是为了使处理器内部的运算单元能够尽量被充分利用,处理器可能会对输入代码进行乱序执行处理,也就是处理器优化。除了处理器会对代码进行优化乱序处理,很多编译器也会有类似的优化,比如Java虚拟器的即时编译器(JIT)也会做指令重排。
  5. 可想而知,任由处理器和编译器对指令重排的话,可能会导致各种各样的问题。

并发编程问题

  1. 原子性、可见性、有序性问题,是人们抽象出来的,而这个抽象的底层问题就是为了解决前面提到的缓存一致性问题、处理器优化和指令重排问题等。
  2. 原子性概念:是指一个操作中就是CPU不可以在中途暂停然后再调度,既不被中断操作,要不执行就执行完成,要不执行就不执行。
  3. **可见性 **概念:当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立刻看得到修改的值。
  4. 有序性概念:程序的执行顺序按照代码的先后顺序执行。

有木有发现,缓存一致性问题其实就是可见性问题。而处理器优化是可以导致原子性问题。指令重排会导致有序性问题。所以后面不在提起硬件层面的那些概念,而是使用大家熟悉的原子性、可见性、有序性。

什么是内存模型

为了保证并发编程中可以满足原子性、可见性以及有序性。有一个重要的概念,那就是–内存模型
**为了保证共享内存的正确性(可见性,有序性,原子性),内存模型定义了共享内存系统多线程程序读写操作行为的规范。**通过这些规范保证了并发场景下的一致性、原子性和有序性。

什么是Java内存模型

java内存模型(Java Memory Model,JMM)就是一种符合内存模型规范的,屏蔽了各种硬件和操作系统访问差异的,保证了java程序在各种平台下对内存的访问都能保证效果一致的机制和规范。
Java内存模型所有的变量都存储在主内存,每条线程有自己的工作内存,线程的工作内存保存了该线程中用到的变量的主内存副本拷贝,线程对变量所有的操作都必须在工作内存中进行,不能直接读写主内存。不同的线程之间也无法直接访问对方工作内存中的变量,线程间变量的传递均需要自己的工作内存和主存之间进行数据同步。
JMM数据同步过程

总结:JMM是一种规范,目的是解决由于多线程通过共享内存进行通信时,存在本地内存数据不一致、编译器会对代码指令重排序、处理器会对代码乱序执行等带来的问题。目的就是保证并发编程场景中的原子性、可见性和有序性。

Java内存模型的实现

java提供了一系列和并发处理相关的关键字,比如volatile、synchronized、final、concurrent包等
synchronized保证了原子性可见性和有序性
volatile保证了可见性和有序性,但是不能保证原子性。volatile禁止指令重排序
final保证了可见性

总结

在读完本文之后,相信你应该了解了什么是Java内存模型、Java内存模型的作用以及Java中内存模型做了什么。
想要了解更多,可以参考《深入理解Java虚拟机》和《Java并发编程的艺术》两本书。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值