JMM理解
JMM概念JMM(Java内存模型Java Memory Model , 简称JMM)本身是一种抽象的概念JMM(Java内存模型Java Memory Model , 简称JMM)本身是一种抽象的概念并不真实存在 , 它描述的一组规则或规范 , 通过这组规范定义了程序中各个变量(包括实例字段、静态字段何构成数组对象的元素)的访问方式 。
并不真实存在 , 它描述的一组规则或规范 , 通过这组规范定义了程序中各个变量(包括实例字段、静态字段何构成数组对象的元素)的访问方式 。
JMM关于同步的规定:
1、线程解锁前 , 必须把共享变量的值刷新回主内存
2、线程加锁前 , 必须读取主内存的最新值到自己的工作内存
3、加锁解锁是同一把锁
由于JVM运行程序的实体是线程 , 而每个线程创建时JVM都会为其创建一个工作内存(有些地方称为栈空间) , 工作内存是每个线程的私有数据区域 , 而Java内存模型中的规定所有变量都存储在主内存 , 主内存是共享内存区域 , 所有线程都可以访问 , 但线程对变量的操作(读取赋值等)必须在工作内存中进行 , 首先要将变量从主内存拷贝到线程自己的工作内存空间 , 然后对变量进行操作 , 操作完成后再将变量写会主内存 , 不能直接操作主内存中的变量 , 各个线程中的工作内存中存储着主内存中的变量副本拷贝 , 因此不同的线程间无法访问对方的工作内存 , 线程间的通信(传值)必须通过主内存来完成 , 其简要访问过程入下图:
文章插图
JMM 的八种内存交互操作为了更直观 , 先来看看这张图吧:
文章插图
- lock(锁定):作用于主内存中的变量 , 一个变量在同一时间只能被一个线程锁定 , 即把变量标识为线程独占状态 。
- read(读取):作用于主内存变量 , 表示把一个变量值从主内存传输到线程的工作内存中 , 以便下一步的 load 操作使用 。
- load(载入):作用于线程的工作内存的变量 , 表示把 read 操作从主内存中读取的变量值放到工作内存的变量副本中(副本是相对于主内存的变量而言的) 。
- use(使用):作用于线程的工作内存中的变量 , 表示把工作内存中的一个变量值传递给执行引擎 , 每当虚拟机遇到一个需要使用变量的值的字节码指令时就会执行该操作 。
- assign(赋值):作用于线程的工作内存的变量 , 表示把执行引擎返回的值赋值给工作内存中的变量 , 每当虚拟机遇到一个给变量赋值的字节码指令时就会执行该操作 。
- store(存储):作用于线程的工作内存中的变量 , 把工作内存中的一个变量的值传递给主内存 , 以便下一步的 write 操作使用 。
- write(写入):作用于主内存的变量 , 表示把 store 操作从工作内存中得到的变量的值放入主内存的变量中 。
- unlock(解锁):作用于主内存的变量 , 表示把一个处于锁定状态的变量释放出来 , 释放后的变量才可以被其他线程锁定 。
- 不允许read 和 load、store 和 write 操作之一单独出现 , 也就是 read 操作后必须 load , store 操作后必须 write 。 即不允许一个变量从主内存读取了但工作内存不接受 , 或者从工作内存发起回写了但主内存不接受的情况出现 。
- 不允许线程丢弃它最近的 assign 操作 , 即变量在工作内存中改变了之后必须把该变化同步回主内存 。
- 不允许线程将没有 assign 的数据从工作内存同步到主内存 。
- 一个新的变量必须在主内存中诞生 , 不允许工作内存直接使用一个未被初始化的变量 。 也就是对变量实施 use 和 store 操作之前 , 必须经过 load 和 assign 操作 。
- 数据|新基建时代,高大全的数据管理解决方案是怎样“炼”成的?
- 深入理解Netty编解码、粘包拆包、心跳机制
- 不被理解的超时代发明,你知道几个?在线膜拜大神,西瓜视频真相
- 《深入理解Java虚拟机》:Java内存区域
- 彻底理解 IO 多路复用实现机制
- 《深入理解Java虚拟机》:线程安全,两种同步锁实现
- 输出层|PyTorch可视化理解卷积神经网络
- RFID在冷链物流中的作用-RFID冷链资产管理解决方案
- 研究池|用户在线评论中的商业情报:理解消费者感知及影响因素
- Flink中parallelism并行度和slot槽位的理解