没有合适的资源?快使用搜索试试~ 我知道了~
CodePrometheus#Starry-Notes#Java内存模型1
需积分: 0 0 下载量 189 浏览量
2022-07-25
14:33:27
上传
评论
收藏 8KB MD 举报
温馨提示
试读
1.编译器优化 (包括 JVM,JI 编译器等) 2.CPU指令重排 3.内存的重排序 (可见性的问题,线程A 的修改 B却看不到) 1.单线程规则 2.锁操作
资源推荐
资源详情
资源评论
# JMM
[TOC]
## 概念
### Java内存模型(JMM)
- 和 Java 的**并发编程**有关;
- 实际上是**一组规范**,需要各个 JVM 的实现来遵守 JMM 规范,以便于开发者可以利用这些规范,更方便地开发多线程程序
- JMM 是工具类和关键字的**原理**,volatile、synchronized、lock 等原理都是JMM
- 没有 JMM,就需要自己指定什么时候用内存栅栏(如工作内存和主内存之间的拷贝与同步),例如不同处理器对关键字的理解处理不一样,即便用了关键字,也无法保证并发安全
- 如果没有这样的一个JMM内存模型来规范,那么很可能经过了不同的JVM的不同规则的重排序之后,导致不同的虚拟机上运行的结果不一样
主要规定以下两点:
- 规定了一个线程如何以及何时可以看到其他线程修改后的共享变量的值,即线程之间共享变量的可见性
- 如何在需要的时候对共享变量进行同步
JMM 定义了 JVM 在内存中的工作方式,而在并发编程中,所要处理的两个关键问题就是这两条标准的体现:**线程之间如何通信以及线程之间如何同步**。通信是指线程之间以何种机制来交换信息。在命令式的编程中,线程之间的通信机制有两种:**共享内存和消息传递**,如共享对象进行通信,消息传递如 **wait()和notify()**;
Java 线程之间的通信采用的就是**共享内存模型** (指的就是 JMM),线程之间通过读-写内存中的公共状态来隐式进行通信;
**JMM 决定一个线程对共享变量的写入何时对另一个线程可见**。从抽象的角度来看,JMM 定义了线程和主内存之间的抽象关系:**线程之间的共享变量存储在主内存(main memory)中,每个线程都有一个私有的本地内存(local memory),本地内存中存储了该线程以读/写共享变量的副本**。本地内存是 JMM 的一个抽象概念,并不真实存在。它涵盖了缓存,写缓冲区,寄存器以及其他的硬件和编译器优化;
JMM 中最重要的就是三个概念,**重排序(有序性),可见性,原子性**;
### JVM 内存模型
和 **Java 虚拟机**的运行时区域有关
Class 文件 -> 类加载器 -> 运行时数据区(方法区,堆 |
点击阅读更多
资源评论
王者丶君临天下
- 粉丝: 17
- 资源: 265
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功