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

本文探讨了现代计算机内存模型、缓存一致性问题及其解决方案,介绍了JSR133规范在Java内存模型中的角色,详细解释了JMM、重排序、原子性、可见性、有序性等概念,并梳理了多线程编程中的关键问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • JMM和物理机内存模型不是一个范畴。

  • JMM和Java运行时数据区没有直接对应关系。

03以史为鉴-回看计算机内存模型

========================

**1、**现代计算机内存模型

物理机遇到的并发问题与Java虚拟机中的情况有不少相似之处,物理机对并发问题的处理方案对虚拟机的实现也有相当大的参考价值。现代计算机中,CPU的指令速度远远超过内存的存取速度,由于计算机的存储设备与CPU的运算速度有几个数量级的差距,所以现在计算机中都不得不加入一层读写速度尽可能接近CPU运算速度的高速缓存(cache)来作为内存和CPU之间的缓冲。

基于高速缓存的存储交互很好的解决了CPU和内存的速度的矛盾,但也引入了一个新的问题,缓存一致性,在多处理器系统中,每个CPU都有自己的高速缓存,而他们又共享同一主内存,当多个处理器运算任务都涉及到同一块主内存区域时,将可能导致各自的缓存数据不一致。为了解决这个问题,需要各个处理器在访问内存时,需要遵循一些协议,例如MSI、EMSI、MOSI等。

图片

图1 计算机内存模型

2、缓存一致性

为了解决这个问题,先后有过两种办法:

  • 总线锁机制

总线锁就是使用CPU提供的一个LOCK#信号,当一个处理器在总线上输出此信号,其他处理器的请求将被阻塞,那么该处理器就可以独占共享锁。这样就保证了数据一致性。

  • 缓存锁机制

但是总线锁定开销太大,我们需要控制锁的力度,所以又有了缓存锁,核心就是缓存一致性协议,不同的CPU硬件厂商实现方式稍有不同,有MSI、MESI、MOSI等。

3、多线程编程面临的问题

多线程编程面临的两个重要的问题是:

  • 线程之间的通信

  • 线程之间的同步

线程之间的通信是指线程之间通过什么方式来交换信息。

同步是指程序用于控制不同线程之间操作发生相对顺序的机制。

线程的通信方式:

  • 共享内存

  • 消息传递

在共享内存的并发模式里,线程之间共享程序的公共状态,线程之间通过读-写内存中的公共状态来实现隐式通信。

在消息传递的并发模式里,同步是显式进行的,程序员必须显式指定某个方法或某段代码需要在线程之间互斥进行。

图2 共享内存并发模型

在消息传递的并发模式里,线程之间没有公共状态,线程之间必须明确发送消息来显式进行通信。

在消息传递的并发模型里,同步是隐式进行的,由于消息发送必然在消息接收之前,因此同步是隐式进行的。

图片

图3 消息传递并发模型

04师夷长技-直面JSR133

=======================

1、JSR133是什么

JSR-133规范,即Java内存模型与线程规范,由JSR-133专家组开发。JSR-133规范是JSR-176(定义Java平台Tiger(5.0)发布版的重要特性)的一部分。本规范的标准内容将合并到Java语言规范、Java虚拟机规范以及java.lang包的类说明中。

2、 JSR133倾诉的对象是谁

身边好多同事反馈看不懂JSR133的内容,一方面是因为文档全部为英文,并且包含大量的专业英语。另外一方面是没有弄明白JSR133倾诉的对象到底是谁。如果弄明白的倾诉的对象,然后对号入座就能理解JSR133在说什么。JSR133倾诉的对象有两个,一个是使用者(程序员)ÿ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值