java内存模型和线程

news2024/11/17 2:33:58

java内存模型

一个服务端需要同时对多个客户端提供服务,就是并法的具体场景。
衡量一个服务性能的好坏,每秒实务处理数(Transactions Per Second,TPS)是重要指标,它代表一秒内服务端平均能响应的请求总数。

硬件的效率和一致性

基于高速缓存的存储交互很好地解决了处理器和内存速度之间的矛盾,但是引入了缓存一致性的问题,在多路处理器系统中,每个处理器都有自己的高速缓存,而它们又共享同一个主内存,这种系统又叫做共享内存多核处理器。
需要多个处理器缓存和内存之间的协调,需要遵守缓存协议,有MSI,MESI等等。
在这里插入图片描述

java内存模型

《Java虚拟机规范》中曾经定义“Java内存模型”(JMM)来屏蔽各种硬件和操作系统的内存访问差异。
程序员只需要按照内存模型进行开发,虚拟机能够利用硬件的各种特性(寄存器,高速缓存和指令集中的特有指令)来实现模型细节。

JMM主要定义了各种变量的访问规则

即关注在虚拟机中把变量值存储到内存和从内存中取出的底层实现。

这里讨论的变量值是除了局部变量和方法参数的,因为两者存储在线程私有的栈中,不会有并法问题。

JVM会主动使用寄存器和缓存硬件来JMM。
在这里插入图片描述
在JMM中每个线程有自己的工作内存。
JMM定义了所有的变量都存储在主内存中,线程的工作内存中保存被该线程使用的变量的副本。
线程对变量的操作都必须在工作内存中进行,而不能操作主内存中的数据。
线程间的变量传递也需要主内存当中间人。

内存间的交互

数据从主内存到工作内存,工作内存到主内存。
JMM有8种原子操作:

  1. read+load:将变量从主内存变量加载到工作内存变量。
  2. use:将变量从工作内存变量载入到执行引擎。
  3. store+write将变量从工作内存变量写回到主内存变量中。
  4. assign:将变量从执行引擎赋值给工作线程变量。
  5. lock:将主内存的变量,标识为一条线程独占的状态。
  6. unlock

指令monitorexit和monitorenter就是lock和unlock的实现,synchronized就是使用的来实现的原子性

  • read+load和store+write是一起出现的,但不要求连续,变量一定会写入线程内存或者写入主内存。
  • 线程执行assign操作后必须要写回到主内存(即变量在工作内存中改变后必须要写回到主内存中。
  • 一个变量只能从主内存中诞生,并且传入线程内存。
  • 一个变量在同一时间内只允许一条线程对其lock操作,但线程可以执行多次lock操作,解锁都需要多次unlock。
  • lock会清空工作内存中此变量的值。
  • unlock之前必须将变量先同步回主内存中。

volatile:只能保证可见性

volatile值被一个线程修改后,其他线程立刻可见修改。(volatile值在各个线程中是一致的)。
但是volatile并不是线程安全的,因为取值和操作值,回写值不是一个原子操作,可能在写回之前其他线程已经修改过了。
volatile在JMM实现的逻辑:

  • 每次使用volatile变量都需要从主内存中取到线程变量(use,load,read连续使用)。
  • 在工作内存中的volatile变量修改后会立刻写回主内存。(store,write,assign连续使用)。
  • volatile变量不会iu被指令重排序优化。

可见性

synchronized和final和volatile实现可见性。
synchronized在unlock之前将变量写回到主内存中。
final在构造器中初始化完成后,其他线程就能看到其值。

默认的JMM执行顺序

  • 一个线程内,按顺序执行。
  • 执行先后传递性。

Java线程

Java实现了对主流的操作系统的线程实现的封装,我们使用Java代码,而java代码调用Native方法。

映射方式:《java虚拟机规范》没有规范,各自实现。

java线程1:1映射操作系统轻量级进程

HotSpot采用,线程调度全权交给操作系统,只能设置线程优先级给操作系统提建议。

多个java线程映射到一个操作系统进程1:N

混合实现N:M

Java与协程

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1573991.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

汇川PLC学习Day4:电机参数和气缸控制参数

汇川PLC学习Day4:伺服电机参数和气缸控制参数 一、伺服电机参数二、气缸参数1. 输入IO映射(1)输入IO映射(2) 输入IO触摸屏标签显示映射 2. 输出IO映射(1)输出IO映射(2) …

java中的正则表达式和异常

正则表达式: 作用一:用来校验数据格式是否合法 作用二:在文本中查找满足要求的内容 不用正则表达式:检验QQ号是否合法,要求全部是数字,长度在6-20,不能以0开头 public class test {public stat…

Python爬虫-爬取药膳食谱数据

🎈 博主:一只程序猿子 🎈 博客主页:一只程序猿子 博客主页 🎈 个人介绍:爱好(bushi)编程! 🎈 创作不易:喜欢的话麻烦您点个👍和⭐! 🎈…

顺序表的应用之通讯录

学习了顺序表之后,我们也得知道它的实际用途吧!所以,我们今天来学习一下通讯录的实现。 typedef struct personInfo SLDataType; contact.h #define NAME_MAX 20 #define GENDER_MAX 20 #define GTEL_MAX 20 #define ADDR_MAX 100 #include&…

post请求爬虫入门程序

<!--爬虫仅支持1.8版本的jdk--> <!-- 爬虫需要的依赖--> <dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.2</version> </dependency><!-- 爬虫需…

复现ChatGLM-6B

ChatGLM-6B 是一个开源的、支持中英双语的对话语言模型,基于 General Language Model (GLM) 架构,具有 62 亿参数。结合模型量化技术,用户可以在消费级的显卡上进行本地部署(INT4 量化级别下最低只需 6GB 显存)。 项目代码https://github.com/THUDM/ChatGLM-6B 权重开放:…

VMware Workstation Pro 全屏模型隐藏上方命令栏

点击命令栏左侧的小图标&#xff0c;可以隐藏或固定命令栏。 如果要取消白线&#xff0c;参考&#xff1a; 虚拟机全屏后隐藏vmware菜单栏的问题

【KLEE】使用Docker安装KLEE KLEE的简单使用 KLEE的约束文件

本文架构 零、前言一、KLEE简介二、Docker安装KLEE1. 使用apt安装docker2.拉取klee镜像3.使用git 拉取klee源码4.安装klee镜像5. 运行镜像 三、试用KLEE的examples1.查看并了解待测文件examples/get_sign/get_sign.c2.KLEE进行符号测试的基本步骤编译成LLVM位码文件使用KLEE进行…

爬取微博热搜榜

需求&#xff1a; 利用python和xpath爬取微博热搜榜 步骤&#xff1a; 爬虫的步骤 获取网页数据-》分析网页数据-》提取网页数据。 1&#xff0c;首先获取微博热搜数据。 热搜主页为 https://s.weibo.com/top/summary?caterealtimehot 打开收&#xff0c;按F12获取网页源…

FebHost:墨西哥.MX域名概述

墨西哥&#xff0c;这片充满生机与历史的国度&#xff0c;以其丰富的文化传统、诱人的美食以及壮丽的自然景观吸引着世界各地的游客。从古老的阿兹特克和玛雅文明到现代都市的繁华街区&#xff0c;墨西哥为每一位访客和当地居民提供了一场视觉与感官的盛宴。 关于 .MX 域名 作…

特征值与特征向量的关系,Au=λu

特征值与特征向量的关系在线性代数中是一个核心概念&#xff0c;尤其在处理矩阵和线性变换时。给定一个矩阵 A A A&#xff0c;如果存在一个非零向量 u u u和一个标量 λ \lambda λ&#xff0c;使得 A u λ u Au \lambda u Auλu&#xff0c;那么我们就说 λ \lambda λ是矩…

docker使用arthas基本教程

供参考也是自己的笔记 docker容器下使用遇到的问题&#xff1a;大致是连接不上1号进程 我这边主要的问题是用户权限问题&#xff0c;docker容器使用aaa用户启动&#xff0c;那个在docker容器内&#xff0c;需要使用aaa用于启动 docker 容器如何使用arthas #实现下载好arthas …

【LeetCode】--- 动态规划 集训(二)

目录 一、63. 不同路径 II1.1 题目解析1.2 状态转移方程1.3 解题代码 二、931. 下降路径最小和2.1 题目解析2.2 状态转移方程2.3 解题代码三、174. 地下城游戏3.1 题目解析3.2 状态转移方程3.3 解题代码 一、63. 不同路径 II 题目地址&#xff1a; 不同路径 II 一个机器人位于…

2024年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年N1叉车司机证模拟考试题库及N1叉车司机理论考试试题是由安全生产模拟考试一点通提供&#xff0c;N1叉车司机证模拟考试题库是根据N1叉车司机最新版教材&#xff0c;N1叉车司机大纲整理而成&#xff08;含2024年…

『VUE』13. Class绑定(详细图文注释)

目录 动态和静态类结合采用数组的方式引入数组语法的动态类名代码演示总结 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 欢迎关注 『VUE』 专栏&#xff0c;持续更新中 首先样式类定义 <style> .active {font-size: 50px; } .text-danger {color: red; } </style&g…

一文带你理解完Git知识点

文章目录 Git基础概念Git基本操作**0. 初始化仓库****1. add到暂存区****2. 再commit到本地仓库****3. 推送到远程仓库****4. 拉取远程仓库****5. 撤销更改** Git分支管理1. 创建分支命令2. 切换分支命令3. 摘取提交4. 删除分支命令5. 合并分支命令6. 变基 Git进阶1. **git tag…

计算机网络 实验指导 实验8

三层交换机的访问控制 1.实验拓扑图&#xff1a; 名称接口IP地址网关Switch AF0/1192.168.1.1/24F0/2172.1.1.1/24Switch BF0/1192.168.1.2/24F0/2172.2.2.1/24PC1172.1.1.2/24172.1.1.1PC2172.1.1.3/24172.1.1.1PC3172.2.2.2/24172.2.2.1PC4172.2.2.3/24172.2.2.1 2.实验目的…

Stable Diffusion介绍

Stable Diffusion是一种前沿的开源深度学习模型框架&#xff0c;专门设计用于从文本描述生成高质量的图像。这种称为文本到图像生成的技术&#xff0c;利用了大规模变换器&#xff08;transformers&#xff09;和生成对抗网络&#xff08;GANs&#xff09;的力量&#xff0c;以…

PPT在线压缩工具推荐

有时候使用邮箱发送邮件时&#xff0c;添加的PPT、Word、PDF文档总会因为过大而转为其他类型的附件发送&#xff0c;不仅上传缓慢&#xff0c;对方查收下载时还有有效期限制&#xff0c;7天或15天后就过期再也无法下载了&#xff0c;有没有什么办法可以压缩PPT等文档&#xff0…

基于单片机光伏太阳能跟踪系统设计

**单片机设计介绍&#xff0c;基于单片机光伏太阳能跟踪系统设计 文章目录 一 概要二、功能设计三、 软件设计原理图 五、 程序六、 文章目录 一 概要 基于单片机光伏太阳能跟踪系统的设计&#xff0c;旨在通过单片机技术实现对光伏太阳能设备的自动跟踪&#xff0c;以提高太阳…