整理:JAVA内存模型

计算机内存模型(了解即可)

CPU缓存

CPU缓存:随着CPU技术的发展,CPU的运行速度越来越快,从内存中读取和写入数据的过程和CPU执行速度之间的差距越来越大,导致CPU每次操作内存都要耗费很长的等待时间,为了解决这一问题,从而提出了在CPU和内存之间增加缓存这一方案。

CPU进行计算时就可以直接从它的告诉缓存中读取数据和写入数据,当运算结束之后,再将缓存的数据刷新到主存中去(物理内存)。

随着CPU能力的不断提升,一级缓存就无法满足需求了,从而逐渐衍生出了多级缓存,它按照数据的读取顺序,及与CPU结合的紧密程度,目前的CPU缓存可以分为:一级缓存(L1),二级缓存(L2),且在某些高端CPU中还支持三级缓存(L3),在这些缓存中所存储的全部数据,都是下一级缓存一部分数据。即:当CPU要读取某一个数据时,首先从一级缓存中查找,如果没有找到,再从二级缓存中查找,如果还没有找到,就从三级缓存或者主内存中查找。

在单核CPU中,只包含一套L1,L2,L3缓存,而在多核CPU中,则每个cpu核心都含有一套L1(当存在L3时,可能也独享L2),而共享L2(或者和L3)。

core1
L1 cache
core2
L1 cache
L2 cache
L2 cache
L3 cache
core1
L1 cache
core2
L1 cache
L2 cache

缓存一致性、指令重排序

缓存一致性:由于在CPU和主存之间增加了缓存区,在多线程场景下就会存在缓存一致性问题。

指令重排序:为了使处理器内部的运算单元能够尽量的被充分利用,处理器可能会对输入代码进行乱序执行处理.除了现在很多流行的处理器会对代码进行优化乱序处理,很多编程语言的编译器也会有类似的优化,如Java虚拟机的即时编译器(JIT)也会做指令重排序。

并发编程的三大特性

  • 原子性:即一个或者多个操作作为一个整体,,要么全部执行,要么都不执行,并且操作在执行过程中不会被线程调度机制打断;而且这种操作一旦开始,就一直运行到结束,中间不会有任何上下文切换。。
  • 有序性:即程序执行的顺序按照代码的先后顺序执行。对应了上述指令重排序问题。
  • 可见性:指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。对应了上述的缓存一致性问题。

总结:要想并发程序正确地执行,必须要保证原子性、可见性以及有序性。只要有一个没有被保证,就有可能会导致程序运行不正确。

更多详情参考《并发编程三大特性》

内存模型

内存模型:为了保证共享内存的正确性,人们定义了共享内存系统中读写操作的行为规范。如缓存一致性协议,如Intel的MESI协议。《大话处理器-Cache一致性协议之MESI》

解决的问题:解决了CPU多级缓存、处理器优化、指令重排等导致的内存访问问题,保证了并发场景下的一致性、原子性和有序性。

解决问题的方式:限制处理器优化和使用内存屏障。作为Java开发人员,我们知道就行了。当然需要了解更多详情的话,可以参考《优化屏障和内存屏障》

Java内存模型(重要)

什么是JAVA内存模型(Java Memory Model,JMM)

一种符合内存模型规范的,屏蔽了各种硬件和操作系统的访问差异的,保证了Java程序在各种平台下对内存的访问都能保证效果一致的机制及规范。

  • 它规定了JAVA中所有的变量都存在与主内存中,每个线程有着单独的工作内存。
  • 每个线程的工作内存中保留了该线程使用到的变量副本。
  • 每个线程对变量的操作都在自己的工作内存中进行,不能直接读写主内存。
  • 每个现在的工作内存不能被其他线程所访问。
  • 不同线程之间的变量传递需要通过主内存进行同步。
JMM
JMM
线程1
线程1工作内存
线程2
线程2工作内存
主内存

注:主内存和工作内存与JVM内存结构中的Java堆、栈、方法区等并不是同一个层次的内存划分,无法直接类比。

Java内存模型,除了定义了一套规范,还提供了一系列原语,封装了底层实现后,供开发者直接使用。比如volatile、synchronized、final、concurren包等。

原子性:在Java中可以使用synchronized来保证方法和代码块内的操作是原子性的。

可见性:Java中可以使用volatile来保证多线程操作时变量的可见性。同时synchronized和final两个关键字也可以实现可见性。

有序性:在Java中,可以使用synchronized和volatile来保证多线程之间操作的有序性。实现方式有所区别:volatile关键字会禁止指令重排。synchronized关键字保证同一时刻只允许一条线程操作。


参考

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值