volatile的应用

volatile,中文意思是不稳定的、反复无常的,用来修饰变量,和多线程、并发有关系。

Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行。

在多线程并发编程中 synchronized 和 volatile 都扮演着重要的角色。volatile 是轻量级的 synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果 volatile 使用恰当的话,它比 synchronized 的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

volatile 是如何来保证可见性的呢?对 volatile 修饰的共享变量进行写操作时,观察其汇编指令可发现有一条Lock前缀的指令。这个指令在多核处理器下会引发两件事情:

1)将当前处理器缓存行的数据写回到系统内存。

2)这个写回内存的操作会导致其他处理器的缓存无效。

为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存(L1,L2,L3)后再进行操作,但操作完之后不知道何时会写到内存。如果对 volatile 修饰的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是,这个时候其他处理器缓存的值还是旧值,再执行计算操作就会有问题。所以,在多核处理器下,为了保证各个处理器的缓存一致,就会实现缓存一致性协议(MESI协议),每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器缓存行设置为无效状态,当处理器对这个数据进行写操作时,会重新从系统内存中把数据读到处理器缓存中。

转载于:https://www.cnblogs.com/koushr/p/9302330.html

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

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

相关文章

漫谈国内智能手机市场现状

本文纯属一时兴起,想到哪儿写到哪儿,本人文笔也不咋地,写的也比较随意,如有错误欢迎指正,有啥意见欢迎交流。原创文章,转载注明emouse的技术专栏。 我是一个不折不扣的数码爱好者,对电脑手机这些…

【刷题】BZOJ 4195 [Noi2015]程序自动分析

Description 在实现程序自动分析的过程中,常常需要判定一些约束条件是否能被同时满足。 考虑一个约束满足问题的简化版本:假设x1,x2,x3,…代表程序中出现的变量,给定n个形如xixj或xi≠xj的变量相等/不等的约束条件,请判定是否可以分别为每一个…

mysql 5.5 安装配置方法图文教程

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 回忆一下mysql 5.5 安装配置方法,整理mysql 5.5 安装配置教程笔记,分享给大家。 MySQL下载地址:htt…

git解除与远程分支的关联

在工作中,经常需要将同一份代码传到不同的git仓库中去 如果本地同样一份代码,已经关联了一个与远程分支,那么怎么才能解除原程分支,并关联到一个新的分支将代码提交到新的分支上去呢? 1、如果你已经在远程创建了一个分…

FindWindow用法

函数功能:该函数获得一个顶层窗口的句柄,该窗口的类名和窗口名与给定的字符串相匹配。这个函数不查找子窗口。在查找时不区分大小写。 函数型:HWND FindWindow(LPCTSTR IpClassName,LPCTSTR IpWindowName&#xff0…

中国大城市政治地位综合实力排名

中国大城市政治地位综合实力排名! 中国大城市政治地位综合实力排名!政治地位: 政治地位: 1(直辖市 4 个):上海、北京、天津、重庆 2(副省级城市 15 个):广州、深圳、武汉、南京、沈阳…

sourcemap总结

sourcemap在线上压缩文件调试中很重要,在此总结如下: 1. 开启sourcemap (1). 浏览器要开启source-map支持(2). 压缩文件底部要有source-map的URL,压缩要开启source-map(3). .map文件要放在服务器,source-map URL指向的位置 2. sou…

navicat 导出的sql文件,再导入,运行SQL文件成功,数据库中却没有表

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到教程。 问题描述:本来在数据库上右键 ,运行SQL文件 ,就可以导入 sql ,建表成功,并且数据也该的…

mysql索引之二级索引学习总结

二级索引又称辅助索引、非聚集索引(no-clustered index)。b&#xff0b;tree树结构。然而二级索引的叶子节点不保存记录中的所有列&#xff0c;其叶子节点保存的是<健值&#xff0c;(记录)地址>。好似聚集索引中非叶子节点保存的信息&#xff0c;不同的是二级索引保存的是…

264,avs中Skip宏块与Direct预测模式 ,对称模式的区别

1. B_Skip类型宏块 &#xff1a;无像素残差&#xff0c;无运动矢量残差&#xff08;MVD&#xff09;和参考帧。解码时&#xff0c;通过Direct预测模式&#xff08;时间或空间&#xff09;计算出前、后向MV后&#xff0c;直接利用前、后向MV得到像素预测值。像 素重构值像…

【hdu 6444】Neko's loop

【链接】 我是链接,点我呀:) 【题意】 给你一个序列. 你可以选择起点i。 然后每次往右跳k次。 得到下一个值a[ik];。 问你跳m次能得到的最大值ma是多少。 如果>s输出0 否则输出s-ma; 【题解】 最后肯定会形成gcd(n,k)个环的。 对于每个环(长度为cnt。 预处理出从1..2cnt的…

高性能MySQL之Count统计查询

近一段时间&#xff0c;有同事问我 “MySQL执行count很慢&#xff0c;有没有什么优化的空间”。当时在忙&#xff0c;就回复了一句“innodb里面count统计都是实时统计&#xff0c;慢一些是正常的”&#xff0c; 周末闲暇下来&#xff0c;想到以前有好多人都问过关于count的问题…

js转换字符串为base64位

在window对象下有两个api,可以对ASCII编码进行编译,得到base64位的字符串 btoa:编码为base64atob:解码为ASCII码此种方法不能对中文进行操作,因为ASCII码中没有中文,如果编码会得到乱码 要编码中文可以先用encodeURIComponent() 对字符串进行转义,转义后再btoa()成base64就可以…

java 文件下载,中文表名,中文内容

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 RequestMapping("userDownloadTemplet")private void userDownloadTemplet(HttpServletRequest request,HttpServletResponse …

cherry-pick的用法

简述 git cherry-pick可以选择某一个分支中的一个或几个commit(s)来进行操作。例如&#xff0c;假设我们有个稳定版本的分支&#xff0c;叫v2.0&#xff0c;另外还有个开发版本的分支v3.0&#xff0c;我们不能直接把两个分支合并&#xff0c;这样会导致稳定版本混乱&#xff0c…

Docker 二进制安装docker

https://blog.csdn.net/bruce_yds/article/details/80035714转载于:https://www.cnblogs.com/Presley-lpc/p/9698724.html

264,avs重要的变量:

B帧&#xff1a; B8pdir[i] i为0,1,2,3&#xff1b;值的含义&#xff1a;0&#xff1a;前向 &#xff1b;1&#xff1a;后向&#xff1b;2&#xff1a;双向&#xff1b;如果为intra_block,则为-1. B8mode[i] i为0,1,2,3 &#xff0c;值的含义&#xff1a;1:16x16 2:16x8 3…

insert into 语句的三种写法

前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到教程。 insert into 语句的三种写法 方式1、 INSERT INTO t1(field1,field2) VALUE(v001,v002); // 明确只插入一条Value 方式2、 IN…

Linux系统中跟TCP相关的内核参数

1. TCP保活机制 参考 《Nginx(三) 配置文件详解 - 基础模块》3.18章节 net.ipv4.tcp_keepalive_intvl&#xff1a;设置两次相邻探活检测的间隔时间。默认是75秒&#xff0c;单位是秒。net.ipv4.tcp_keepalive_probes&#xff1a;设置探活最多检测次数。默认是9次&#xff0c;单…

ECMAScript3中数组方法

<!DOCTYPE html><html lang"en"><head> <meta charset"UTF-8"> <title>ECMAScript3中数组方法</title></head><body><script>//字符串和数组之间相转换的方法 1.join() split() /*var str abcdefg…