java内存模型和线程

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.rhkb.cn/news/299091.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2013年认证杯SPSSPRO杯数学建模C题(第二阶段)公路运输业对于国内生产总值的影响分析全过程文档及程序

2013年认证杯SPSSPRO杯数学建模 C题 公路运输业对于国内生产总值的影响分析 原题再现: 交通运输作为国民经济的载体,沟通生产和消费,在经济发展中扮演着极其重要的角色。纵观几百年来交通运输与经济发展的相互关系,生产水平越高…

开源流程图表库(04):mxGraph,都是可视化编辑,导出使用。

mxGraph是一个用于创建和展示图形的JavaScript库。它提供了丰富的功能和工具,可以用于构建各种类型的图形应用程序,包括流程图、组织结构图、网络拓扑图等。 mxGraph的编辑器 一、mxGraph的特点和功能 以下是一些mxGraph的特点和功能: 强大…

WordPress建站教程:10步快速搭建个人网站

WordPress是一个广泛使用的内容管理系统(CMS),凭借其用户友好的界面和大量可定制的主题和插件,为WordPress 提供了多功能性和灵活性,可用于创建各种类型的网站,包括个人博客、B2B企业网站、B2C外贸网站等&a…

jvm基础三——类加载器

类加载器 在Java中,类加载器(Class Loader)是Java虚拟机(JVM)的一部分,负责将类文件(.class文件)加载到JVM中,使得程序能够使用这些类。类加载器在Java中具有重要的作用&…

OSError: Can‘t load tokenizer for ‘bert-base-chinese‘

文章目录 OSError: Cant load tokenizer for bert-base-chinese1.问题描述2.解决办法 OSError: Can’t load tokenizer for ‘bert-base-chinese’ 1.问题描述 使用from_pretrained()函数从预训练的权重中加载模型时报错: OSError: Can’t load tokenizer for ‘…

达梦数据库 优化

谁进行优化?优化什么? 优化不能仅从数据库方面考虑,比如,在存储达到数据库极限、应用涉及人员设计的代码稀巴烂的情况下,进行调优就是杯水车薪的效果。 涉及到优化人员: 数据库管理员应用程序架构师应用…

数据结构|排序总结(1)|直接插入排序

排序分类 插入排序:直接插入排序,希尔排序 选择排序:选择排序,堆排序 交换排序:冒泡排序,快速排序 归并排序 插入排序 直接插入排序 相当于摸牌,例如我们现在手上有{2,4&#xff0…

MySql并发事务问题

事务 事务概念: 事务是一组操作的集合,它是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,即这些操作要么同时成功,要么同时失败。 事务的特性:ACID: 小…

Qt元对象系统

第二章Qt元对象系统 文章目录 第二章Qt元对象系统1.什么是元对象?2.元对象系统组成3.信号与槽信号和槽的本质绑定信号与槽自定义槽定义槽函数必须遵循一下规则槽函数的类型自定义槽案例 自定义信号自定义信号需要遵循以下规则信号和槽重载二义性问题 4.内存管理1. 简…

Unity性能优化篇(十四) 其他优化细节以及UPR优化分析器

代码优化: 1. 使用AssetBundle作为资源加载方案。 而且经常一起使用的资源可以打在同一个AssetBundle包中。尽量避免同一个资源被打包进多个AB包中。压缩方式尽量使用LZ4,少用或不要用LZMA的压缩方式。如果确定后续开发不会升级Unity版本,则可…

【Java EE】初识Spring Web MVC

文章目录 🌴什么是Spring Web MVC?🌸什么是Servlet呢? 🌲MVC 定义🌸再理解Spring MVC 🌳如何学习Spring MVC呢?⭕总结 🌴什么是Spring Web MVC? Spring Web MVC 是基于…

《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》

《捕鱼_ue4-5输出带技能的透明通道素材到AE步骤》 2022-05-17 11:06 先看下带透明的特效素材效果1、首先在项目设置里搜索alpha,在后期处理标签设置最后一项allow through tonemapper2、在插件管理器中,搜索movie render ,加载movie render q…

图论模板详解

目录 Floyd算法 例题:蓝桥公园 Dijkstra算法 例题:蓝桥王国 SPFA算法 例题:随机数据下的最短路问题 总结 最小生成树MST Prim算法 Kruskal算法 例题:聪明的猴子 Floyd算法 最简单的最短路径算法,使用邻接…

win10上一个详细的Django开发入门例子

1.Django概述 Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,视图V和模版T。 Django 框架的核心组件有: 用于创建模型的对象关系映射; 为最终用户设计较好的管理界面&#xff1b…

数学矩阵GCD和lCM(详解)

矩阵乘法 知阵乘法是《线性代数》中的基础内容,但在考察数学的算法题中也会出现。 本节我们学习基础的矩阵乘法规则。 每个矩阵会有一个行数和一个列数,只有当相乘的两个矩阵的左矩阵的列数等于右矩阵的行数 时,才能相乘,否则不允…

Rust---复合数据类型之枚举、数组

目录 枚举的使用Option 枚举数组的使用输出结果 枚举(Enum):表示一个类型可以有多个不同的取值。枚举类型可以包含不同的变体(variants),每个变体可以有不同的数据类型。 枚举的使用 enum Direction {Up,…

LeetCode-131. 分割回文串【字符串 动态规划 回溯】

LeetCode-131. 分割回文串【字符串 动态规划 回溯】 题目描述:解题思路一:回溯, 回溯三部曲解题思路二:0解题思路三:0 题目描述: 给你一个字符串 s,请你将 s 分割成一些子串,使每个…

八股面试速成—Java语法部分

暑期实习面试在即,这几天八股和算法轮扁我>_ 八股部分打算先找学习视屏跟着画下思维导图,然后看详细的面试知识点,最后刷题 其中导图包含的是常考的题,按照思维导图形式整理,会在复盘后更新 细节研究侧重补全&a…

牛客NC181 单词拆分(一)【中等 动态规划,前缀树 Java,Go,PHP】

题目 题目链接: https://www.nowcoder.com/practice/c0d32c1ce5744472a01b2351a2c2767f 思路 前缀树动态规划参考答案Java import java.util.*;public class Solution {/*** 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规…

Docker、Kubernetes之间的区别

比较容器化工具:了解 Docker、Kubernetes 在应用程序部署和管理方面的差异。 基本概述 Docker 是一个流行的容器化平台,允许开发人员在容器中创建、部署和运行应用程序。 Docker 提供了一组工具和 API,使开发人员能够构建和管理容器化应用程…