面试-JMM的内存可见性

1.JAVA内存模型
在这里插入图片描述
分析:
由于JVM运行程序的实体是线程,而每个线程创建时,JVM都会 为其创建一个工作内存(栈空间),用于存储线程私有的数据。而java内存模型中规定所有变量都存储在主内存中。主内存是共享内存区域,所有线程都可以访问。但线程对变量的操作即读取,赋值等必须在工作内存中进行。首先将变量从主内存拷贝到自己的工作内存当中,然后对变量进行操作。操作完成后再将变量写回主内存。不能直接操作主内存中的变量,工作内存中存储着主内存中的变量的副本拷贝。工作内存是每个线程的私有区域,因此不同的线程间无法访问对方的工作内存。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分析:
主内存属于共享数据区域,从某个角度讲包括了堆和方法区。而工作内存线程私有数据区域,从某个程度上将应该包括程序计数器,虚拟机栈,本地方法栈。
在这里插入图片描述
2.JMM如何解决可见性问题
把数据从内存加载到缓存,寄存器,
然后运算结束,写回主内存。
在这里插入图片描述
为了提高性能,处理器和编译器常常会对指令进行重排序。
在这里插入图片描述
3.happens-before原则
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
4.volatile机制
在这里插入图片描述
但是对于volatile变量运算操作,在多线程环境中,并不保证安全性。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
分析:
通过引入synchronized代码块,试图解决多线程请求单例时带来的重复创建单例的隐患。
原因在于某一个线程执行到第一次检测的时候,读到的instance不为空时,instance的引用对象可能还没完全初始化。因为instance = new Singleton()。可能分为一下三部完成。首先,分配对象内存空间,初始化对象,设置instance指向刚分配的内存地址。此时instance !=null.此时,可能会发生重排序。将第三部提前了。结果如上图右。先设置instance的内存地址,然后在初始化对象。这种情况单线程没有问题,但是多线程会发生问题。
所以,解决方式是使用volatile。

在这里插入图片描述
5.synchronized与volatile的区别
在这里插入图片描述

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

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

相关文章

Python-PDF文件密码破解小工具

背景 经常从网络上下载的PDF笔记被加了密,在自己学习的过程中想要添加书签却因为没有密码无法添加,所以通过Python实现一个解密小工具,亲测大多数密码都可以破解。 代码 import os import tkinter as tk from tkinter import filedialog #…

你还不知道Modbus RTU???

1. 什么是Modbus RTU Modbus RTU(Remote Terminal Unit)是Modbus通信协议的一种变种,用于串行通信。它是一种常见的工业控制系统通信协议,通常用于采集传感器数据、控制执行器和监控设备状态。Modbus RTU采用二进制编码&#xff0…

【深度学习】实现基于MNIST数据集的TensorFlow/Keras深度学习案例

基于TensorFlow/Keras的深度学习案例 实现基于MNIST数据集的TensorFlow/Keras深度学习案例0. 什么是深度学习?1. TensorFlow简介2. Keras简介3. 安装TensorFlow前的注意事项4. 安装Anaconda3及搭建TensorFlow环境1) 下载安装Anaconda Navigator2&#xf…

go语言day06 数组 切片

数组 : 定长且元素类型一致,在索引逻辑上连续存储,数组的内存地址是存储的第一个元素的内存地址 几种创建方式: 仅声明 var nums [ 3 ] int 声明并赋值 var nums [ 2 ] string {"武沛齐","alex"} 声明并按下标赋值 var nums [ 3 ] int {0:88,2:1 } 省略…

ffmpeg+nginx+video实现rtsp流转hls流,web页面播放

项目场景: 最近调试海康摄像头需要将rtsp流在html页面播放,因为不想去折腾推拉流,所以我选择ffmpeg转hls流,nginx转发,html直接访问就好了 1.首先要下载nginx和ffmpeg 附上下载地址: nginx nginx news ffmpeg htt…

HttpServletRequest・getContentLeng・getContentType区别

getContentLength(): 获取客户端发送到服务器的HTTP请求主体内容的字节数(长度) 如果请求没有正文内容(如GET),或者请求头中没有包含Content-Length字段,则该方法返回 -1 getContentType()&am…

eclipse中svn从分支合并到主干及冲突解决

1、将分支先commit,然后再update,然后再clean一下,将项目多余的target都清理掉。 2、将branches切换到trunk 3、工程上右键-》Team-》合并(或Merge) 4、默认选项,点击Next 5、有未提交的改动,…

文献阅读:通过双线性建模来破译神经元类型连接的遗传密码

文献介绍 文献题目 Deciphering the genetic code of neuronal type connectivity through bilinear modeling 研究团队 Mu Qiao(美国加州理工学院) 发表时间 2024-06-10 发表期刊 eLife 影响因子 7.7 DOI 10.7554/eLife.91532.3 摘要 了解不同神经元…

打造爆款秘籍:阿里巴巴国际站测评补单优势全攻略

在阿里巴巴国际站,买家复购率和其他销售指标是衡量产品市场潜力和销售成功与否的关键指标。当系统评估出产品具有巨大的市场潜力时,它会相应地增加对产品的流量支持;反之,如果潜力不足,产品的排名将会受到影响&#xf…

使用 Spring Boot 3.x 与图形学技术,添加电子印章防伪特征

使用 Spring Boot 3.x 与图形学技术,添加电子印章防伪特征 在电子办公和无纸化办公日益普及的今天,电子印章的使用越来越广泛。然而,如何确保电子印章的安全性和防伪能力成为了一个亟待解决的问题。本文将通过 Spring Boot 3.x 和图形学技术,深入探讨如何为电子印章添加防…

Redis-实战篇-什么是缓存-添加redis缓存

文章目录 1、什么是缓存2、添加商户缓存3、前端接口4、ShopController.java5、ShopServiceImpl.java6、RedisConstants.java7、查看Redis Desktop Manager 1、什么是缓存 缓存就是数据交换的缓冲区(称为Cache),是存贮数据的临时地方&#xff…

01数字电子技术基础

第一节课:introduction 导论 决定了这门课的学习方法、学习内容、一个大概的把握、虽不是具体的技术,不是细节,但是这是一节思想 每门课都重要,但侧重点不同。 学习前人的思想和营养,为自己所用。 1.课程性质&#x…

【Text2SQL 论文】MAGIC:为 Text2SQL 任务自动生成 self-correction guideline

论文:MAGIC: Generating Self-Correction Guideline for In-Context Text-to-SQL ⭐⭐⭐ 莱顿大学 & Microsoft, arXiv:2406.12692 一、论文速读 DIN-SQL 模型中使用了一个 self-correction 模块,他把 LLM 直接生成的 SQL 带上一些 guidelines 的 p…

前端:HTML、CSS、JavaScript 代码注释 / 注释与代码规范

一、HTML 行内注释 HTML注释是在HTML代码中添加说明和解释的一种方法&#xff0c;这些注释不会被浏览器渲染或显示在页面上&#xff0c;而是被浏览器忽略。HTML注释对于代码的可读性、可维护性和团队协作非常重要。 1.1、HTML注释的语法 HTML注释的语法是以<!--开始&…

大学生必备!GitHub星标破千的matlab教程(从新手到骨灰级玩家)

MATLAB&#xff08;Matrix Laboratory&#xff09;是MathWorks公司推出的用于算法开发、数据可视化、数据分析以及数值计算的高级技术计算语言和交互式环境的商业数学软件。 MATLAB具有数值分析、数值和符号计算、工程与科学绘图、数字图像处理、财务与金融工程等功能&#xf…

【传拓研学】传承文化瑰宝,领略千年韵味

非遗薪火&#xff0c;传承中华文明 文化繁荣&#xff0c;共筑美好未来 在这风云变幻的时代&#xff0c;我们始终怀揣着对历史与文化的敬仰之情。今日&#xff0c;我们隆重向您推荐一项极具意义的活动——传拓研学活动。 传拓是我国一项古老的传统技艺&#xff0c;非遗物质文…

jenkins api部署时,一直提示pending-Finished waiting

问题&#xff1a; 调用jenkins api部署时&#xff0c;一直提示pending-Finished waiting 解决方案&#xff1a; 这个问题困扰了很久&#xff0c;一直没有思路&#xff0c;后面看到调用jenkinsAPI本身会出现一段提示&#xff0c;pending in the quiet period&#xff0c;通过搜…

优雅谈大模型13:LangChain Vs. LlamaIndex

实时了解业内动态&#xff0c;论文是最好的桥梁&#xff0c;专栏精选论文重点解读热点论文&#xff0c;围绕着行业实践和工程量产。若在某个环节出现卡点&#xff0c;可以回到大模型必备腔调或者LLM背后的基础模型重新阅读。而最新科技&#xff08;Mamba,xLSTM,KAN&#xff09;…

流水线构建ipa实战

# 进入当前工作空间目录 cd ${WORKSPACE}/# Project名称 PROJECT_NAME"xxx"## Scheme名&#xff0c; 具体获取看图一 SCHEME_NAME"xxx"## 编译类型 Debug/Release二选一 BUILD_TYPE"Release"## 项目根路径&#xff0c;.xcodeproj文件所在路径 PR…

String(C++)

文章目录 前言文档介绍经典题目讲解HJ1 字符串最后一个单词的长度 模拟实现框架构造函数析构函数迭代器c_str()赋值size()capacity()reserveempty()[ ]访问front/backpush_backappendoperatorinsert一个字符insert一个字符串eraseswapfind一个字符find一个字符串substr()clear(…