JVM(入门篇08)JMM Java内存模型模型. 详解.
一、什么是JMM?
1.定义:
JMM(Java Memory Model)Java内存模型.
2. JMM 和 JVM 的区别
- JVM内存模型指的是 – 内存分区图
- JMMJava内存模型 指的是 一种**
==虚拟机规范==
.**
二、JMM有何用?
1. (抽象)定义了主内存和线程之间的关系:
之前在多线程安全问题的产生 的时候也涉及到了点击跳转
1.共享变量在主内存中 (Main Memory)
2.每个线程在本地内存(Local Memory)
3.本地内存和主内存是抽象的概念,物理上不存在,只是更多的读写和计算都运行在 本地内存中,所以本地内存待遇更好(优先使用高速度的寄存器和高速缓存)
2. 线程 A 和 线程 B如何通信?
必须通过主内存,线程安全问题就是通信失败的例子.
Java 高级,多线程,线程安全产生的原因;多线程问题的代码模拟
3. 工作内存和主内存交互的8大操作
名称 | 作用内存 | 作用 |
---|---|---|
1.Lock(锁定) | 主内存 | 把一个锁住(变量标识为一条线程独占状态。) |
2.Unlock(解锁): | 主内存 | 把变量解锁(可继续被其他线程锁定了) |
3.Read(读取) | 主内存 | 读取变量的值到工作内存,以便后的load操作 |
4.Load:(载入) | 工作内存 | 把read的值放到工作内存的变量副本中。 |
5.use(使用) | 工作内存 | 把工作内存变量副本中的值传递给执行引擎进行使用**(比如计算)**, |
6.assign(赋值) | 工作内存 | 执行引擎计算后的值赋 |
给工作内存的变量副本中 | ||
7.store(储存) | 工作内存 | 工作内存的变量副本的值传递给主内存,和载入相反 |
8.write(写入) | 主内存 | 将store的值写入到主内存变量中 |
4. 八大操作必须满足以下规则
规则 | 解释 |
---|---|
1.顺序执行 | 如果把一个变量从主内存复制到工作内存,就需要胆汁顺序地执行store和write操作,但是没有必须保证是连续执行 |
2.配对出现 | 不允许 read 和load,store 和 write 单一出现 lock 和 unlock 单一出现 |
3.没assign不准回主内存 | 如果一个变量没有经历重工作内存中取出的到执行引擎运算,就不让回去 |
4.变量从主内存中出生 | 一个变量只能在主内存中产生 |
5. | 如果对一个变量执行lock操作,将会清空工作内存中此变量的值,在执行引擎使用这个变量前需要重新执行load或assign操作初始化变量的值 |
6. | 如果一个变量事先没有被lock操作锁定,则不允许对它执行unlock操作;也不允许去unlock一个被其他线程锁定的变量 |
7. | 对一个变量执行unlock操作之前,必须先把此变量同步到主内存中(执行store和write操作)。 |