当前位置:网站首页>『每日一问』简单聊聊JMM/说说对JMM的了解
『每日一问』简单聊聊JMM/说说对JMM的了解
2022-07-25 09:16:00 【高级摸鱼工程师】
JMM是什么
Java Memory Model , Java内存模型,简称JMM。
Java线程之间的通信由JMM控制。JMM决定了一个线程对共享资源的写何时对另一个线程可见。从抽象的角度讲,JMM定义了线程和主内存之间的关系,每个线程都有一个本地内存1,存储了主内存中共享资源的「副本」。
JMM内存模型

上边说过了,JMM控制线程通信。那么如图线程A、B是如何通信的呢
- 线程A将自己本地内存中的共享变量刷新到主内存
- 线程B将自己本地内存中的副本置为无效,读取主内存中的共享变量值
以上两步可以看出来
- 线程之间的通信必须经过主内存。
- JMM通过控制每个线程的本地内存和主内存的交互,向我们提供内存可见性保证。
重排序
在一个程序执行的时候,为了优化程序性能,编译器和处理器常常会对指令做重排序。重排序可能会导致多线程程序出现内存可见性问题。
JMM对这两种类型重排的处理和要求:
- 对于编译器重排序:JMM会禁止特定类型的编译器重排序。 那么是哪些呢?
- 对于处理器重排序:JMM会要求Java编译器在生成指令序列的时候,插入特定类型的内存屏障(Memory Barries)来禁止特定类型的处理器重排序。
JMM作为一个语言级的内存模型,在不同的编译器和处理器上,通过禁止特定类型的编译器和处理器重排序,提供一致的内存可见性保证。
数据依赖性
如果两个操作访问同一个变量,且这两个操作中有一个是写操作,那么这两个操作之间就存在数据依赖性。
产生数据依赖性的操作有三种:
- 读后写
- 写后读
- 写后写
以上三种操作,如果顺序被重排,那么程序的结果就会被改变。
as-if-serial语义
as-if-serial(串行化)的语义是:不管编译器和处理器为了提供并行度做怎样的重排序,单线程程序的执行结果不能被改变2。
那么为了达到这个效果,编译器和处理器不会对存在数据依赖性的操作做重排序。
如图,C分别与A、B都有数据依赖关系,那么C就不会被重排在A、B任何一个之前去执行。
那么最后可能的顺序就是:
happens-before
如果一个操作happens-before另一个操作,那么第一个操作的执行结果对第二个操作可见,但是第一个操作的执行顺序不一定排在第二个之前。如果这两个操作由数据依赖关系,那么第一个操作就排在第二个之前,反之亦然。
多线程之间操作的happens-before关系的确立是依靠着代码上的正确同步。
边栏推荐
- [arm] Xintang nuc977 transplants wk2124 drive
- 优炫数据库对数据的加密是如何做的?
- The simplest sklearn environment configuration tutorial in the whole network (100% success)
- Leetcode组合总和+剪枝
- Ten thousand words long, one word thoroughly! Finally, someone has made business intelligence (BI) clear
- Query efficiency increased by 10 times! Three optimization schemes to help you solve the deep paging problem of MySQL
- 全网最简约的sklearn环境配置教程(百分百成功)
- activemq--可持久化机制之AMQ
- [buuctf-n1book][Chapter 2 advanced web]ssrf training
- Full solution of JDBC API
猜你喜欢

2022-7-14 JMeter pressure test

activemq--可持久化机制之JDBC的journal

This ten-year content industry infrastructure company is actually an invisible Web3 pioneer

分享一个避免递归的部门设计方法

2022-7-14 JMeter simulates the login of different users for pressure test

Do you know these methods of MySQL database optimization?
![[C language] dynamic memory management, flexible array](/img/da/b9455885df0cb6646908e3655d62c5.png)
[C language] dynamic memory management, flexible array
![[buuctf-n1book][Chapter 2 advanced web]ssrf training](/img/29/8894d04b27e0e73c4458c27bd9b935.png)
[buuctf-n1book][Chapter 2 advanced web]ssrf training

图解LeetCode——1184. 公交站间的距离(难度:简单)

Illustration leetcode - 919. Complete binary tree inserter (difficulty: medium)
随机推荐
leetcode-238.除自身以外数组的乘积
Write two channel (stereo) immediately Wav file
[common tools] obtain system status information based on psutil and gputil
Query efficiency increased by 10 times! Three optimization schemes to help you solve the deep paging problem of MySQL
The operation cannot be completed because a folder or file in it is already open in another program
activemq--可持久化机制之KahaDB
registration status: 204
Disable module (attribute node) in LabVIEW
[C language] dynamic memory management, flexible array
对称式加密与非对称式加密的对比
The development of art NFT
图解LeetCode——919. 完全二叉树插入器(难度:中等)
【npm】 无法将“npm”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。
What are the commands used by pl/sql tools to export SQL files?
Collection of common algorithm questions in test post interview
Shell script
360度拖拽全景图插件tpanorama.js
ActiveMQ -- JDBC code of persistent mechanism
activemq--可持久化机制
API parsing of JDBC