Java面试题:volatile专题

封面:volatile专题.png

王有志,一个分享硬核Java技术的互金摸鱼侠
加入Java人的提桶跑路群:共同富裕的Java人

今天是《面霸的自我修养》第4篇文章,我们一起来看看面试中会问到哪些关于volatile的问题吧。
数据来源:

  • 大部分来自于各机构(Java之父,Java继父,某灵,某泡,某客)以及各博主整理文档;
  • 小部分来自于我以及身边朋友的实际经历,题目上会做出标识,并注明面试公司。

叠“BUFF”:

  • 八股文通常出现在面试的第一二轮,是“敲门砖”,但仅仅掌握八股文并不能帮助你拿下Offer;
  • 由于本人水平有限,文中难免出现错误,还请大家以批评指正为主,尽量不要喷~~
  • 本文及历史文章已经完成PDF文档的制作,提取关键字【面霸的自我修养】。

理论篇

指令重排

:::info
难易程度:🔥🔥🔥
:::
:::warning
重要程度:🔥🔥🔥
:::
:::success
面试公司:无
:::
指令重排是一种优化技术,通过指令乱序执行(Out Of Order Execution,简称OoOE或OOE)提高处理器的执行效率和性能
以下内容摘自维基百科:

在计算机工程领域,乱序执行错序执行,英语:out-of-order execution,简称OoOEOOE)是一种应用在高性能微处理器中来利用指令周期以避免特定类型的延迟消耗的范式。在这种范式中,处理器根据输入数据的可用性确定执行指令的顺序,而不是根据程序的原始数据决定。在这种方式下,可以避免因为获取下一条程序指令所引起的处理器等待,取而代之的处理下一条可以立即执行的指令。

指令重排的基础建立在保证当线程环境下语义准确性的前提下,而不能保证多线程环境下的语义。


内存屏障

:::info
难易程度:🔥🔥🔥🔥🔥
:::
:::warning
重要程度:🔥🔥🔥
:::
:::success
面试公司:无
:::
内存屏障(Memory barrier),也称内存栅栏内存栅障屏障指令等,是一类同步指令,它使CPU或编译器进行操作时严格按照一定的顺序执行,即保证内存屏障前后的指令不会因为指令重排而导致乱序执行。
JVM中定义了7种屏障:

class OrderAccess : private Atomic {
public:static void     loadload();static void     storestore();static void     loadstore();static void     storeload();static void     acquire();static void     release();static void     fence();
}

其中最重要的是4种基本的内存屏障:

  • LoadLoad,指令:Load1; LoadLoad; Load2。确保Load1在Load2及之后的读操作前完成读操作,Load1前的Load指令不能重排序到Load2及之后的读操作后;
  • StoreStore,指令:Store1; StoreStore; Store2。确保Store1在Store2及之后的写操作前完成写操作,且Stroe1写操作的结果对Store2可见,Store1前的Store指令不能重排序到Store2及之后的写操作后;
  • LoadStore,指令:Load1; LoadStore; Store2。确保Load1在Store2及之后的写操作前完成读操作,Load1前的Load指令不能重排序到Store2及之后的写操作后;
  • StoreLoad:指令:Store1; StoreLoad; Load2。确保Store1在Load2及之后的Load指令前完成写操作,Store1前的Store指令不能重排序到Load2及之后的Load指令后。

至于acquire,release和fence,我们通过一张表格来表示它们与4种基本内存屏障的对应关系:


约束
fenceLoadLoad
StoreStore
LoadStore
StoreLoad
releaseLoadStore
StoreStore
acquireLoadLoad
LoadStore

图1:3种内存屏障.png
Tips

  • 内存屏障的定义位于orderAccess.hpp中,强烈建议阅读注释中的“Memory Access Ordering Model”
  • 重点理解4种基本内存屏障实现的功能即可,JVM源码对的部分了解即可,也别往下卷了,啥时候是个头啊
  • Java中定义的内存屏障屏蔽不同操作系统间内存屏障的差异,使得不同的操作系统表现出一致的语义。

原理篇

🔥volatile是什么?

:::info
难易程度:🔥🔥🔥
:::
:::warning
重要程度:🔥🔥🔥
:::
:::success
面试公司:腾讯
:::
volatile是Java提供的关键字,可以用来修饰成员变量。volatile提供了两个能力:

  • 保证被修饰变量在多线程环境下的可见性
  • 禁止被修饰变量的指令重排
volatile保证可见性的例子
private static volatile boolean flag = true;public static void main(String[] args) throws InterruptedException {new Thread

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

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

相关文章

攻防世界-web-Training-WWW-Robots

题目信息 In this little training challenge, you are going to learn about the Robots_exclusion_standard. The robots.txt file is used by web crawlers to check if they are allowed to crawl and index your website or only parts of it. Sometimes these files rev…

[word] 如何将word文本转换成表格? #知识分享#学习方法#媒体

如何将word文本转换成表格? 如何将word文本转换成表格?不管是Word入门新手还是老手,相信这个技巧会让你更加熟练Word,操作起来得心应手! 1.文本转换成表格 同样的要怎么把一堆凌乱的数据转换成表格呢?这里…

排序算法——归并排序

基本思想 归并排序是建立在归并操作上的一种非常有效的排序算法。该算法是采用分治法的一个非常典型的应用。将已有的子序列合并,得到完全有序的序列。即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路并…

凸包表面积、体积、包围框的坐标、对角线

凸包表面积、体积、包围框的坐标、对角线 一、算法原理1.计算表面积.2.计算体积3.返回包围框最大值坐标4.返回包围框最小值坐标5.包围盒的对角线长度 二、代码三、结果展示1.函数信息展示2.点云数据3.凸包后数据 四、相关链接 一、算法原理 1.计算表面积. area hull.get_sur…

【JavaEE】_synchronized关键字——监视器锁monitor lock

目录 1. synchronized的特性 2. synchronized的使用 3. Java标准库中的线程安全类 1. synchronized的特性 (1)互斥: 前文已经介绍,某个线程执行到某个对象的synchronized中时,其他线程如果也执行到同一个对象&…

数据结构day1

定义一个学生结构体&#xff0c;包含结构体成员&#xff1a;身高&#xff0c;姓名&#xff0c;成绩&#xff1b;定义一个结构体数组有7个成员&#xff0c;要求终端输入结构体成员的值&#xff0c;根据学生成绩&#xff0c;进行冒泡排序。 #include <stdio.h> #include &l…

14. UE5 RPG使用GameplayTag

GameplayTag本来是应用在GAS游戏技能系统里面的&#xff0c;后来UE直接将其抽离出来&#xff0c;作为一个模块&#xff0c;现在可以不在GAS里也可以使用这个模块。比如&#xff0c;我需要判断一个射线拾取的物体&#xff0c;首先我需要判断这个actor是否存在&#xff0c;然后判…

Linux:sed进阶(12)

Linux&#xff1a;shell脚本&#xff1a;基础使用&#xff08;5&#xff09;《正则表达式-sed工具》_linux脚本表达式s-CSDN博客https://blog.csdn.net/w14768855/article/details/132347574?ops_request_misc%257B%2522request%255Fid%2522%253A%252217084222871680019707523…

STM32使用软件SPI协议操作TFT18彩屏

时间记录&#xff1a;2024/2/20 一、SPI协议介绍 &#xff08;1&#xff09;SPI设备通过4根线进行通信&#xff0c;CS片选线&#xff0c;选择从设备&#xff0c;SCK时钟线&#xff0c;由主设备产生时钟&#xff0c;主机MOSI线连从机MISO线&#xff0c;由主机向从机发送信息&am…

openEuler 22.03 LTS 上源码安装 PostgreSQL 15

安装PostgreSQL 15 1 安装必要的依赖 #yum install -y readline-devel zlib-devel gcc2、下载源码 # wget https://ftp.postgresql.org/pub/source/v15.6/postgresql-15.6.tar.gz # tar -xzvf postgresql-15.6.tar.gz3 配置 # cd postgresql-15.6/ # ./configure4 编译安装…

mac东西拷不进硬盘怎么回事 mac东西拷不进硬盘怎么办 mac硬盘读不出来怎么解决 mac拷贝不了东西到u盘

有时候我们在使用mac的过程中&#xff0c;可能会遇到一些问题&#xff0c;比如mac东西拷不进硬盘。这是一种很常见的情况&#xff0c;但是会影响我们的工作和生活。那么&#xff0c;mac东西拷不进硬盘是怎么回事呢&#xff1f;mac东西拷不进硬盘又该怎么办呢&#xff1f;本文将…

Flutter 动画(显式动画、隐式动画、Hero动画、页面转场动画、交错动画)

前言 当前案例 Flutter SDK版本&#xff1a;3.13.2 显式动画 Tween({this.begin,this.end}) 两个构造参数&#xff0c;分别是 开始值 和 结束值&#xff0c;根据这两个值&#xff0c;提供了控制动画的方法&#xff0c;以下是常用的&#xff1b; controller.forward() : 向前…

自助点餐系统微信小程序,支持外卖、到店等

总体介绍 系统总共分为三个端&#xff1a;后端&#xff0c;后台管理系统、微信小程序。 基于当前流行技术组合的前后端分离商城系统&#xff1a; SpringBoot2MybatisPlusSpringSecurityjwtredisVue的前后端分离的商城系统&#xff0c; 包含分类、sku、积分、多门店等 预览图…

【动态规划专栏】专题一:斐波那契数列模型--------4.解码方法

本专栏内容为&#xff1a;算法学习专栏&#xff0c;分为优选算法专栏&#xff0c;贪心算法专栏&#xff0c;动态规划专栏以及递归&#xff0c;搜索与回溯算法专栏四部分。 通过本专栏的深入学习&#xff0c;你可以了解并掌握算法。 &#x1f493;博主csdn个人主页&#xff1a;小…

深度学习基础——卷积神经网络(一)

卷积操作与自定义算子开发 卷积是卷积神经网络中的基本操作&#xff0c;对于图像的特征提取有着关键的作用&#xff0c;本文首先介绍卷积的基本原理与作用&#xff0c;然后通过编写程序实现卷积操作&#xff0c;并展示了均值、高斯与sobel等几种经典卷积核的卷积效果&#xff…

变分自编码器(VAE)PyTorch Lightning 实现

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

290. Word Pattern(单词规律)

题目描述 给定一种规律 pattern 和一个字符串 s &#xff0c;判断 s 是否遵循相同的规律。 这里的 遵循 指完全匹配&#xff0c;例如&#xff0c; pattern 里的每个字母和字符串 s 中的每个非空单词之间存在着双向连接的对应规律。 提示: 1 < pattern.length < 300 pa…

安装VMware+安装Linux

以上就是VMware在安装时的每一步操作&#xff0c;基本上就是点击 "下一步" 一直进行安装 安装Linux VMware虚拟机安装完毕之后&#xff0c;我们就可以打开VMware&#xff0c;并在上面来安装Linux操作系统。具体步骤如下&#xff1a; 1). 选择创建新的虚拟机 2). 选…

C. LR-remainders

思路&#xff1a;正着暴力会tle&#xff0c;所以我们可以逆着来。 代码&#xff1a; #include<bits/stdc.h> #define int long long #define x first #define y second #define endl \n #define pq priority_queue using namespace std; typedef pair<int,int> p…

如何确定分库还是 分表?

分库分表 分库分表使用的场景不一样&#xff1a; 分表因为数据量比较大&#xff0c;导致事务执行缓慢&#xff1b;分库是因为单库的性能无法满足要求。 分片策略 1、垂直拆分 水平拆分 3 范围分片&#xff08;range&#xff09; 垂直水平拆分 4 如何解决数据查询问题&a…