jvm——内存模型

news2024/9/27 19:21:15

1.java内存模型

1.1 原子性

 

 

1.2 问题分析

这里与局部变量自增不同,局部变量调用iinc是在局部变量表槽位上进行自增。 

静态变量是在操作数栈自增。

这里的主内存和工作内存时再JMM里的说法。

 因为操作系统是时间片切换的多个线程轮流使用CPU.

1.3解决方法

JMM中通过synchronized(同步关键字)保证原子性。

使用synchronized减i++和i--的分别的所有字节码指令作为一个整体运行。

使用synchronized加锁的力度最好大一点,只锁个i++就只有四条指令,不然增加时间。

2.可见性

2.1退不出的循环

运行发现停不下来了。

运行超过一秒之后就触发C2编译器进行优化了。run被读到了线程的局部变量表里面。

1s后再修改也看不见了。

 

2.2解决方法

 

2.3可见性

volatile只适用于一个写线程和多个读线程的情况。

 

println底层有synchronized关键字,也可以强制线程去到主存里面取值。

synchronized可以保证可见性和原子性。

3.有序性

3.1诡异的结果

应该是指令顺序为了优化发生了改变导致ready=true时num还没获取到2。 

3.2解决方法

@Outcome注解就是检查感兴趣的结果。

1或4就划分为可接受的,ok表示之中

0划分到另一个。

清除并重新编译

生成一个源码jar包和一个压测入口jar包。 

 

 运行测试包进行压测。

结果中有两种,一个是带了关闭了分层编译,还有一个是没带任何参数。

 两种情况都有出现0的结果。

说明指令重排问题确实有。

解决方法就是使用volatie关键字。 

再次压测就不会有指令重排的问题了。

3.3有序性理解

双重检测法创建单例 就需要volatile防止指令重排

 

如果在创建的代码上加锁力度就太大了,创建该对象了,后续get该对象是不需要加锁的。

所以有了上面的双重判断,先判断是否实例为空,为空就加锁,加完锁再判断实例为空,任然为空就创建。

第一个if是为了提高效率,实例创建后,就不用一直获得锁对象。

第二个if是防止别的线程创建另一个实例。

 0分配空间,3复制多一个引用进操作数栈4一个引用去调用构造方法7另一个引用交给了静态变量

t2直接返回了拿到了一个不完整的实例。

3.4 happens-before

就相当于打个标记,标记前改了值, 标记后看得见 

 

4.CAS与原子类

4.1 CAS

CAS 是 Compare And Swap(比较并替换的缩写,当值为预期值的时候,就将该值替换为预期的值。

CAS 也是实现原子操作的一种方法。

 

  

4.2乐观锁与悲观锁

4.3原子操作类

测试结果为0。 

5.synchronized 优化(这个部分要先去看JUC)

5.1轻量级锁

A有两次加锁,一次轻量锁,一次重量锁。升级过程就是锁膨胀。

轻量级锁的加锁过程。

线程和对象之间交换定情信物,对象给出了Mark World存在线程的锁记录里面,线程给出了锁记录地址。

Mark Word只有八个字节,解锁时才会将对象的Mark Word恢复。 

锁了A之后去访问B尝试锁B结果发现已经锁了,但是是自己上的锁所以还是可以访问B.

然后都访问完了之后就A和B都解锁。

解锁过程是把MarkWorld都还回去然后取出对象上的锁标记。 

5.2锁膨胀

 

 升级为重量级锁会把标记从01变成10,并在对象头里面加入重量级锁的指针,该指针用于线程1在解锁时唤醒阻塞中的线程。 

5.3重量锁_自旋

这里线程2不会立刻 阻塞,阻塞需要把当前状态保存下来。

直接采用了自旋优化,先不停,不停重试,在阈值之内等到了对象解锁

 自旋失败 就进入阻塞状态了。

5.4 偏向锁

锁重入就是要锁不同的代码块时对同一个对象加锁。

 

 5.5其它优化

上锁时间过长可能会导致轻量锁变成重量锁。

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

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

相关文章

2023京东酒类市场数据分析(京东数据开放平台)

根据鲸参谋平台的数据统计,今年7月份京东平台酒类环比集体下滑,接下来我们一起来看白酒、啤酒、葡萄酒的详情数据。 首先来看白酒市场。 鲸参谋数据显示,7月份京东平台白酒的销量为210万,环比下滑约49%;销售额将近19…

前端需要理解的数据结构与算法知识

1 数组 1.1 集合、列表、数组的联系与区别 集合:由一个或多个确定的元素所构成的整体。类型不一定相同、确定、无序、互异。 列表(又称线性列表):按照一定的线性顺序,排列而成的数据项的集合。类型不一定相同、有序…

opencv实现全景图像拼接

目录 部分代码展示: 效果演示 查看处理过程 历史记录 完整演示视频: 完整代码链接 部分代码展示: 效果演示 查看处理过程 历史记录 完整演示视频: 无法粘贴视频........ 完整代码链接 视频和代码都已上传百度网盘&#x…

Kafka 简介 + 学习笔记

消息队列 先说明消息队列是什么: 亚马逊: 消息队列是一种异步的服务间通信方式,适用于微服务架构。消息在被处理和删除之前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工作以及缓解高…

机器学习基础之《分类算法(5)—朴素贝叶斯算法原理》

一、朴素贝叶斯算法 1、什么是朴素贝叶斯分类方法 之前用KNN算法,分类完直接有个结果,但是朴素贝叶斯分完之后会出现一些概率值,比如: 这六个类别,它都有一定的可能性 再比如,对文章进行分类:…

element Collapse 折叠面板 绑定事件

1. 点击面板触发事件 change <el-collapse accordion v-model"activeNames" change"handleChange"><el-collapse-item title"一致性 Consistency"><div>与现实生活一致&#xff1a;与现实生活的流程、逻辑保持一致&#xff0c…

【附安装包】Fireworks 8安装教程

软件下载 软件&#xff1a;Fireworks版本&#xff1a;8语言&#xff1a;简体中文大小&#xff1a;88.3M安装环境&#xff1a;Win11/Win10/Win8/Win7硬件要求&#xff1a;CPU2.0GHz 内存4G(或更高&#xff09;下载通道①百度网盘丨下载链接&#xff1a;https://pan.baidu.com/s…

NetMarvel机器学习促广告收益最大化,加速获客

游戏出海的竞争日益激烈&#xff0c;这并非空穴来风。 从2021年第一季度至2022年第四季度&#xff0c;iOS平台的CPI增长了88%&#xff0c;意味着厂商需要花费近两倍的钱才能获取一个新用户。与此同时数据隐私政策持续收紧&#xff0c;更加提高了营销成本。 在成本高涨的当下&…

Java 中的集合类有哪些?如何分类的?

面试回答 Java 的整个集合框架中&#xff0c;主要分为 List、Set、Queue、Stack、Map 等五种数据结构。其中&#xff0c;前四种数据结构都是单一元素的集合&#xff0c;而最后的 Map 则是以 KV 对的形式使用。 从继承关系上讲&#xff0c;List、Set、Queue都是 Collection 的子…

uniapp 微信小程序:RecorderManager 录音DEMO

uniapp 微信小程序&#xff1a;RecorderManager 录音DEMO 简介index.vue参考资料 简介 使用 RecorderManager 实现录音。及相关的基本操作。&#xff08;获取文件信息&#xff0c;上传文件&#xff09; 此图包含Demo中用于上传测试的服务端程序upload.exe&#xff0c;下载后用…

基于Java+SpringBoot+vue前后端分离体育馆使用预约平台设计实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

Tensor-动手学深度学习-李沐_笔记

介绍 Tensor&#xff0c;又称"张量"&#xff0c;其实就是n维度数组。不同维度的Tensor示意图如下&#xff1a; 关于Tensor.reshape reshape函数可以处理总元素个数相同的任何新形状&#xff0c;【3&#xff0c;2&#xff0c;5】->【3&#xff0c;10】->【5&a…

论文笔记: One Fits All:Power General Time Series Analysis by Pretrained LM

1 intro 时间序列领域预训练模型/foundation 模型的研究还不是很多 主要挑战是缺乏大量的数据来训练用于时间序列分析的基础模型——>论文利用预训练的语言模型进行通用的时间序列分析 为各种时间序列任务提供了一个统一的框架 论文还调查了为什么从语言领域预训练的Transf…

GEE/PIE遥感大数据处理与典型案例丨数据整合Reduce、云端数据可视化、数据导入导出及资产管理、机器学习算法等

目录 ​专题一&#xff1a;初识GEE和PIE遥感云平台 专题二&#xff1a;GEE和PIE影像大数据处理基础 专题三&#xff1a;数据整合Reduce 专题四&#xff1a;云端数据可视化 专题五&#xff1a;数据导入导出及资产管理 专题六&#xff1a;机器学习算法 专题七&#xff1a;…

Spring Cloud Nacos详解

目录 1、Spring Cloud Nacos详细介绍2、Spring Cloud Nacos具体案列 Spring Cloud Nacos 是一个由阿里巴巴集团开发的开源分布式系统服务发现、配置管理和服务管理的平台。Nacos 支持多种服务发现方式&#xff0c;包括 DNS 方式、HTTP 和 RPC 方式&#xff0c;同时提供了灵活的…

GFPGAN 集成Flask 接口化改造

GFPGAN是一款腾讯开源的人脸高清修复模型&#xff0c;基于github上提供的demo&#xff0c;可以简单的集成Flask以实现功能接口化。 GFPGAN的安装&#xff0c;Flask的安装请参见其他文章。 如若使用POSTMAN进行测试&#xff0c;需使用POST方式&#xff0c;form-data的请求体&am…

camshift, pca,协方差

最近复习opencv的东西&#xff0c; 看到camshift https://www.youtube.com/watch?va9KZjQ4e6IA&listPL6Yc5OUgcoTmTGACTa__vnifNA744Cz-q&index30 https://medium.com/claudio.vindimian/understanding-and-implementing-the-camshift-object-tracking-algorithm-pyt…

【现场问题】oracle 11g 和12c 使用jdbc链接,兼容的问题

oracle不同版本 问题是什么寻找解决方式首先Oracle的jdbc链接有几种形式?Oracle 11g的链接是什么呢Oracle 12C的链接是什么呢我的代码是哪种&#xff01;&#xff1f;发现问题没 解决问题代码 问题是什么 项目上建立Oracle数据源&#xff0c;以前大部分都是&#xff0c;11g的…

树模型与集成学习:LightGBM

目录 树模型与集成学习 LightGBM 的贡献 LightGBM 的贡献&#xff1a;单边梯度抽样算法 LightGBM 的贡献&#xff1a;直方图算法 LightGBM 的贡献&#xff1a;互斥特征捆绑算法 LightGBM 的贡献&#xff1a;深度限制的 Leaf-wise 算法 树模型与集成学习 树模型是非常好的…

目标检测(Object Detection):Fast R-CNN,YOLO v3

目录 目标检测(Object Detection) R-CNN SPPNet Fast R-CNN YOLO v1 YOLO v2 YOLO v3 目标检测(Object Detection) 任务是计算机视觉中非常重要的基础问题&#xff0c;也是解决图像分割、目标跟踪、图像描述等问题的基础。目标检测是检测输入图像是否存在给定类别的物体…