您当前的位置:首页 > 电脑百科 > 网络技术 > 网络技术

Java并发编程之验证volatile指令重排-理论篇

时间:2020-03-23 14:22:22  来源:  作者:

JAVA并发编程之验证volatile指令重排-理论篇

Java并发包下的类中大量使用了volatile关键字。通过之前文章介绍,大家已经知道了volatile的三大特性:共享变量可见性;不保证原子性;禁止指令重排后顺序性。通过前面两篇文章我们通过代码验证了前两个特性,本文我们就来验证禁止指令重排保证顺序性。

指令重排序的生活例子

去餐厅吃饭预定位置的的时候。假设要去A餐厅吃饭,A餐厅有前台B、服务员C以及老板D。如果就只有你一个人去吃饭的时候,你给前台或者给服务器或者给老板说一声把2号桌预定了,半小时后过来。餐厅在为了2小时内就你一个人去吃饭。那么OK,没问题,别说等半个小时,就是等一个小时,2号桌还是你的。

但是,如果现在是吃饭高峰期,很多人来吃饭,你给前台说了,前台忙着没有及时给服务员或者没有给老板说,这个时候有个路人甲来吃饭,刚好看到2号桌没人,老板或者服务员就让他就坐2号桌吃饭了。那么,等你过来的时候,2号桌已经有人了。这个时候对于你来说,这个结果就不是你想要的了。

上面案例,如果从计算机执行指令角度来分析的话,你要到2号桌吃饭,这是预期结果。餐厅A就相当于是处理器,前台B就相当于是编译器,服务员C和老板D就是指令和内存系统。如果你预定的时间点不是吃饭高峰期或者没有人去餐厅A吃饭。那么你就相当于是一个线程。就是单线程的。老板、前台、服务员怎么安排都可以。因为只有你一个2号桌肯定是你的。这是单线程情况下。预期结果与实际结果就是一致的。

如果你预定的时间点是吃饭高峰期,很多人来吃饭(很多线程),这个时候为了餐厅效益,无论是前台还是服务员或者是老板都会对你的位置进行重排序。在你没有来的时候,会安排其他人到你预定的位置吃饭。如果其他人在你的位置吃饭,这个时候你再来吃饭,那么实际结果和预期结果就不一样了。这个时候餐厅应该做出相应的赔偿。为了解决这种赔偿问题,老板就想到了一个方案。做个牌子放在客人预定的桌子上。

当前台或者是服务员或者是老板看到餐桌上放的这个牌子,就知道这个位置不能再调动了。其中这个放在餐桌上的牌子就是特殊类型的内存屏障了。

示意图如下:

Java并发编程之验证volatile指令重排-理论篇

 

再来举个更常见的例子:

考试,在考试的时候老师会告诉我们,先做会做的,不会做的放到后面做。假设出题老师出题顺序是1-5,但是考试会根据自己实际情况做题顺序有可能是1、2、4、5、3或者是1、3、4、5、2等等。如果把出题老师看着是写代码的程序员,题目的顺序是代码一行一行的顺序,你的老师会告诉你先做会做的,此时老师就相当于是编译器,会排序一次。然后你自己做的时候又会进行重新排序,你自己就相当于是处理器又排序了一次。

上面两个现实生活中的案例,我们弄明白后,再来看看在计算机中指令重排问题,就很容易理解了。

指令重排

我们程序员编写的代码在JVM执行的时候,为了提高性能,编译器和处理器都会对代码编译后的指令进行重排序。分为3种:

1:编译器优化重排:

编译器的优化前提是在保证不改变单线程语义的情况下,对重新安排语句的执行顺序。

2:指令并行重排:

如果代码中某些语句之间不存在数据依赖,处理器可以改变语句对应机器指令的顺序

如:int x = 10;int y = 5;对于这种x y之间没有数据依赖关系的,机器指令就会进行重新排序。但是对于:int x = 10; int y = 5; int z = x+y;这种的,因为z和x y之间存在数据依赖(z=x+y)关系。在这种情况下,机器指令就不会把z排序在xy前面。

3:内存系统的重排序

通过之前的学习,我们知道了处理器和主内存之间还存在一二三级缓存。这些读写缓存的存在,使得程序的加载和存取操作,可能是乱序无章的。

指令重排序的流程图

通过上面介绍,我们可以知道从程序员写的Java源码到处理器真正实际执行的指令序列,会经历如下图的过程:

 

Java并发编程之验证volatile指令重排-理论篇

 

执行顺序:

源码编译器优化重排序(第一次排序) 指令重排序(第二次)内存重排序(第三次) 最终指向的指令。

无论是第一次编译器的重排序还是第二、三次的处理器重排序。这些重排序当在多线程的场景下可能会出现线程可见性的问题。

如在多线程的情况下,单例模式就不安全了。

为了解决这个问题,JMM允许编译器在生成指令顺序的时候,可以插入特定类型的内存屏障来禁止指令重排序。

当一个变量使用volatile修饰的时候,volatile关键字就是内存屏障。当编译器在生成指令顺序的时候,发现了volatile,就直接忽略掉。不再重排序了。

示意图:

Java并发编程之验证volatile指令重排-理论篇

 

 



Tags:Java   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
本文的目的是演示一个专门设计用于对收据照片执行OCR(光学字符识别)操作并自动从中提取关键业务信息的 API,例如企业名称和地址、电话号码、收据总额等等。在页面的下方,我提供...【详细内容】
2022-07-15  Tags: Java  点击:(2)  评论:(0)  加入收藏
StackOverflowError 可能会让Java开发人员感到恼火,因为它是我们可能遇到的最常见的运行时错误之一。在本文中,我们将通过查看各种代码示例以及如何处理它来了解此错误是如何...【详细内容】
2022-07-14  Tags: Java  点击:(4)  评论:(0)  加入收藏
写在前面无意中看到ch1ng师傅的文章觉得很有趣,不得不感叹师傅太厉害了,但我一看那长篇的函数总觉得会有更骚的东西,所幸还真的有,借此机会就发出来一探究竟,同时也不得不感慨下R...【详细内容】
2022-07-13  Tags: Java  点击:(4)  评论:(0)  加入收藏
今早,看到CSDN里推荐的Python获取女朋友发来加班拍照定位地址是酒店的段子,本来准备验证下,顺便练练手的,最后,安装执行pip install json报没有指定版本号。一怒之下搞我大JAVA,验...【详细内容】
2022-07-12  Tags: Java  点击:(8)  评论:(0)  加入收藏
核心代码:import java.util.Map;import java.util.List;import java.util.Iterator;import java.util.ArrayList;import java.io.IOException;import java.io.InputStream;im...【详细内容】
2022-07-12  Tags: Java  点击:(10)  评论:(0)  加入收藏
Javascript无法直接访问SqlServer数据库的,但可以使用浏览器的“执行SQL”功能查询数据库,将查询结果保存在浏览器变量中,然后在Javascript代码中引用这些变量即可。在浏览器的...【详细内容】
2022-07-11  Tags: Java  点击:(11)  评论:(0)  加入收藏
上半年春招的时候,作为面试官,对于面试表现的不错的同学会要求其写一小段代码看看。题目很简单:给定一个日期,然后计算下距离今天相差的天数。本以为这么个问题就是用来活跃面试...【详细内容】
2022-07-11  Tags: Java  点击:(11)  评论:(0)  加入收藏
跳表是一种数据结构,用于借助连接到元素子序列的链表层次结构来存储元素的排序列表。跳表允许以有效的方式处理项目查找。跳表是一种概率数据结构,这意味着它跳过整个列表中的...【详细内容】
2022-07-08  Tags: Java  点击:(13)  评论:(0)  加入收藏
概述背景是不是在实际开发工作当中经常碰到自己写的代码在开发、测试环境行云流水稳得一笔,可一到线上就经常不是缺这个就是少那个反正就是一顿报错抽风似的,线上调试代码又很...【详细内容】
2022-07-08  Tags: Java  点击:(16)  评论:(0)  加入收藏
我之前分享了Java和Go语言版本的gRPC接口的服务端和客户端的开发,使用的基本都是基础的原声API,旧文如下: Grpc服务开发和接口测试初探【Java】 2022-04-20 gRPC服务开发和接口...【详细内容】
2022-07-07  Tags: Java  点击:(16)  评论:(0)  加入收藏
▌简易百科推荐
前言经过了多年的努力,在 6 月 6 号,IETF (互联网工程任务小组) 正式发布了 HTTP/3 的 RFC。HTTP 历史 1991 HTTP/1.1 2009 Google 设计了基于TCP的SPDY 2013 QUIC 2015 HTTP/2...【详细内容】
2022-07-15  Java机械师    Tags:HTTP/3   点击:(1)  评论:(0)  加入收藏
关于万维网的一点历史没有过去,就没有未来。要了解未来会发生什么,我们需要知道我们现在和以前拥有什么。因此,与其一下跳到web3.0的技术和示例上,我们需要了解 Web 1.0 的基本...【详细内容】
2022-07-05  木偶跳舞    Tags:Web 3.0   点击:(24)  评论:(0)  加入收藏
在刚刚拿到购买的CS10无线网关设备,应该如何开始使用呢?请看下面的几个步骤: Step1:首先我们找到产品包装内的一张带有初始WIFI名称和密码的贴纸,将它贴在产品的背面(以备未来使用...【详细内容】
2022-06-30  PLUS1软件教学频道    Tags:CS10   点击:(32)  评论:(0)  加入收藏
企业局域网内外网分离方案一些企事业单位出于安全考虑,需要做内外网分离。举例来说,需要达到如下的技术要求: 生产网、办公网、外网三网隔离。 启用网络准入,对非规定允许接入的...【详细内容】
2022-06-30  运维幼儿    Tags:内外网分离   点击:(31)  评论:(0)  加入收藏
在这个时代,我们至少有一半的重要信息都在手机上。无论是个人信息或是财务信息,还是敏感项目和工作机密,所有的这些都被我们驻留在手机上。现在越来越多的手机诈骗出现,这种第三...【详细内容】
2022-06-28  AirDroid    Tags:移动设备   点击:(26)  评论:(0)  加入收藏
最近各个方面的事情逐渐地恢复,继续写家庭网络实验室的文章。在考虑洁净和需求之后,我们就需要考虑家庭网络实验室的空间了。首先先亮一个观点——如果你真的想在家...【详细内容】
2022-06-28  iN在    Tags:家庭网络   点击:(29)  评论:(0)  加入收藏
背景:网络穿透互联是方便我们技术人员的一种工具,通过各种协议实现您想要的网络互联。家庭组网可以参照低成本电信家庭宽带架构网络拓扑今天,我们需要在这个基础上扩展网络应...【详细内容】
2022-06-27  应用技术    Tags:局域网互联   点击:(28)  评论:(0)  加入收藏
FTP是File Transfer Protocol(文件传输协议),用来进行服务器和客户端之间文件传输的协议。非常常用的服务,应用场景主要在设备间文件共享,服务程序发布,日志文件管理等方面。这里...【详细内容】
2022-06-27  影三分plus    Tags:FTP   点击:(37)  评论:(0)  加入收藏
一、后台确认监控/录像机在局域网内的IP地址如:192.168.1.158 ,在浏览器内输入后回车,即可进入监控/录像机WEB登录界面 二、输入用户名及密码进入WEB管理界面 三、如果进...【详细内容】
2022-06-23  一往直前的冲吧    Tags:监控   点击:(41)  评论:(0)  加入收藏
人在家中坐,网速突然断。相信这样的情况大家都不陌生。那么,怎么样才能在装维小哥上门前快速自助排查解决简单问题呢?相信这份攻略能够帮到你~ 一旦出现家中断网,而且在重启光猫...【详细内容】
2022-06-22  安利小丸子    Tags:网速   点击:(26)  评论:(0)  加入收藏
站内最新
站内热门
站内头条