JMM(Java Memory Model,Java内存模型)

本文详细介绍了Java内存模型(JMM)的基本概念,包括线程与主内存的关系、工作内存的作用及其实现机制、JMM中的可见性、原子性和有序性等关键特性。此外,还深入探讨了内存屏障的概念及其在保证数据一致性和并发编程中的应用。

一、计算机高速缓存

在这里插入图片描述

二、Java内存模型简介

在这里插入图片描述

  1. JMM抽象描述了Java线程和主内存之间的关系。

  2. 每个线程都有一个自己的工作内存,共享变量保存在主内存中,每个线程工作内存中都有一份共享变量的副本。

  3. 线程间的通信:
    (1)首先,线程A把本地内存A中更新过的共享变量刷新到主内存中去。
    (2)然后,线程B到主内存中去读取线程A之前已更新过的共享变量。

JMM中线程的工作内存只是抽象的概念,并不是实际存在,大概相当于L1、L2、L3高速缓存。

三、8种原子指令

在这里插入图片描述
在这里插入图片描述

四、JMM的三个特征(问题)

  1. 可见性

一个线程修改了共享变量后,怎么立即被其他线程看到?

volatile,通过内存屏障实现可见性
synchronized,ReentrantLock,通过锁实现可见性
final,限制共享变量不能为修改

  1. 原子性

上面8种原子操作指令,单独某一个都是原子性的,但合起来就不是原子性的。
例如,i++操作就不是原子性的。

volatile,不能保证原子性
synchronized,ReentrantLock,可以保证原子性

  1. 有序性

CPU在执行程序时,为了提高性能,会对指令进行重排序,主要分为三种:

(1)编译器优化的重排序。编译器在不改变单线程程序语义的前提下,可以重新安排语句的执行顺序。
(2)指令级并行的重排序。现代处理器采用了指令级并行技术(Instruction-Level Parallelism, ILP)来将多条指令重叠执行。如果不存在数据依赖性,处理器可以改变语句对应机器指令的执行顺序。
(3)内存系统的重排序。由于处理器使用缓存和读/写缓冲区,这使得加载和存储操作看上去可能是在乱序执行。

在这里插入图片描述

五、内存屏障

是一种JMM层面抽象出来的概念,描述的是一种屏障的功能
在CPU层面上来说,就是一些特殊的指令

  1. 屏障的概念划分:

(1)一类是强制读取主内存,强制刷新主内存的内存屏障,叫做Load屏障和Store屏障
(2)另外一类是禁止指令重排序的内存屏障,有四个分别叫做LoadLoad屏障、StoreStore屏障、LoadStore屏障、StoreLoad屏障

  1. X86架构提供的三种屏障指令:

(1)lfence,是一种Load Barrier 读屏障。在读指令前插入读屏障,可以让高速缓存中的数据失效,重新从主内存加载数据

(2)sfence, 是一种Store Barrier 写屏障。在写指令之后插入写屏障,能让写入缓存的最新数据写回到主内存

(3)mfence, 是一种全能型的屏障,具备ifence和sfence的能力

  1. lock前缀指令是内存屏障吗?

不是,lock本质上是一种锁。

六、JMM与JVM之间的关系

JMM和JVM是在不同层次上的划分,两者基本没任何关系。

JMM描述的是线程和内存之间的关系。

JVM是运行时的数据区划。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Alex·Guangzhou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值