volatile关键字的认识和理解

多线程之内存可见性Volatile(一) 从这篇博文开始,我们开始分享一些多线程的内容,毕竟在工作中,使用多线程比较多。多总结一下,终归没有坏处。这个系列的文章不会特别长,争取在3到5分钟之间结束,主要以说明白内容,给出相应的解决方案,重点在于实践。如标题所示,这篇博文我们简单的介绍一下内存可见性问题,之前,要简单的介绍一下什么是内存模型?内存模型什么是JAVA 内存模型?Java Memory Model (JAVA 内存模型)是描述线程 阅读详情

        volatile关键字主要用来修饰一个变量,主要是告诉编译器这个变量不要去优化。

        编译器的优化,在大多数情况下,可以极大的提升程序执行的效率,比如当读取一个变量时,为了提高读取速度,编译器进行优化时有时会先把变量读取到一个寄存器中,以后,再读取变量值时,就直接从寄存器中读取。但是某些特殊情况下,变量的值会被意外的改变,而往往这些情况是编译器意料不到的,所以,就会取到脏数据。还有些时候,编译器在没有意识到这些特殊情况下,对代码进行了优化,那么就会造成优化错误,带来很多难以发现的问题。

        比如:

int a=10,b,c;
b=a;
c=b;

//编译器优化后
int a=10,b,c;
c=b=a;

       volatile的意思是不稳定的,易变的,更直接的说是“直接存取原始内存地址”。使用volatile关键字修饰一个变量,就代表这个变量是易变的,它有可能出现编译器意料的不到的特殊情况发生,也就是说它的值可以被代码之外的东西所改变。这些特殊情况包括,比如,在中断处理函数中更改了这个非自动变量的值;在多线程中,别的线程更改了某个共享变量的值;硬件自动改变了这个变量的值,像寄存器中某些变量,硬件上对某些位进行了设置,值就会发生改变。

       使用volatile关键字就是告诉编译器,这个值可能会被特殊情况改变,所以不要对他相关代码进行优化,并且每次读取这个变量时系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。

     volatile使用时,应注意正确区分,因为频繁地使用volatile很可能会增加代码尺寸和降低性能。

 

参考文章:https://blog.csdn.net/tigerjibo/article/details/7427366

https://mp.weixin.qq.com/s/i9BLvBAv_Rd182EhUw7tVw

产业园区如何通过数智平台提升科技创新服务能力?.docx 科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。 立即下载

相关推荐

【Python编程】Python字符串操作与格式化方法全解析

内容概要:本文全面梳理Python字符串的创建、操作与格式化技术体系,重点对比了%格式化、str.format()、f-string三种格式化方案的语法特性与性能差异。文章从字符串不可变性原理出发,分析拼接操作的内存优化策略(join vs +),探讨正则表达式re模块在复杂文本处理中的应用,以及字符串方法如split、strip、replace的高效用法。通过性能基准测试展示f-string在运行的速度优势,同介绍Unicode编码处理、字节串与字符串转换、模板字符串Template的安全应用场景,最后给出在多语言处理、日志输出、SQL拼接等场景下的格式化选择建议。 https://ligue1.chunxinglong.com/lanqiuliansai/nba.html https://ligue1.chunxinglong.com/zuqiuliansai/shijiebei/ https://ligue1.chunxinglong.com/zuqiuliansai/xijia/ https://ligue1.chunxinglong.com/zuqiuliansai/yingchao/ https://ligue1.chunxinglong.com/zuqiuliansai/fajia/

Volatile

volatile是Java虚拟机提供的轻量级的同步机制。 volatile的特性 保证可见性 不保证原子性 禁止指令重排

yxw678的博客 255

数据库表结构可视化工具

数据库表结构可视化工具是一个基于JavaJavaFX开发的桌面应用程序,用于解析可视化MySQL数据库的表结构,生成ER图,并支持数据字典导出。

volite java_如何理解 JAVA volatile 关键字

最近在重新梳理多线程,同步相关的知识点。关于 volatile 关键字阅读了好多博客文章,发现质量高适合小白的不多,最终找到一篇英文的非常通俗易懂。所以学习过程中顺手翻译下来,一方面巩固知识,一方面希望能帮到有需要的伙伴。该文章并非完全逐字翻译,英文不错的可以选择阅读原文:Java Volatile Keyword基本用法JAVA 语言里的 volatile 关键字是用来修饰变量的,方式如下入所示...

weixin_33615688的博客 639

并发学习(七)— volatile关键字的用法:状态标记,双重检测

前言:volatile关键字通过内存屏障禁止重排序来优化实现对volatile变量写操作,会在写操作后加入一条store屏障指令,将本地内存中的共享变量值刷新到主内存对volatile变量读操作,会在读操作前加入一条load屏障指令,从主内存中读取共享变量总之:每次对被线程访问都强迫从主内存中读取该变量的值,而该变量发生变化,又强迫线程将最新的值刷新回主内存,任何候线程都能看到最新的值...

Jae_Wang的博客 1499

volatile 关键字

本文介绍了volatile关键字 的作用、适用场景、指令重排序实现原理

惟愿无事 1045

java response.write_response设置编码方式 printwrite方法的对比

很多场合会发现我们输出的中文是乱码,这主要可能有两方面的原因:一个是浏览器的解析方式,另一个是我们服务器端返回数据的方式。只要我们保证浏览器的解析方式我们回显的数据的编码格式是一致的,基本上乱码问题就可以得到解决。大多数数情况下,浏览器的默认编码方式是utf-8,因此我们只要设置服务器返回的数据的编码方式也是utf-8即可。在Java后台的Controller代码或者Servlet代码中用res...

weixin_35987446的博客 1153

ASP页面改为UTF-8编码后,刷新页面中文输入输出不定乱码终极解决方案

后来想起 Nosql.asp 文件内的提示文字未使用中文,全部使用的是 &#数字;这样的 UNiCode 形式来表示中文字符。受此启发,于是有了以下函数,改装 Response.Write ,自动检测是否有Ascii值大于255的字符,有的话,则全部转换为&#;形式。从此再也没有出现过乱码了。

业余编程 1034

response.write 输出 utf-8的方法

为了适应xmlhttp控件的需要,这个控件只有在获得utf-8编码的网页内容的候,responseText才能得到正确输出,试了各种方法,甚至在asp服务器上用adodb.steam来转码,后来看到一篇文章,只要在asp中加入以下代码即可,一试,果然成功!只是不清楚为什么。         Response.ContentType="text/html"       Response.Ad

ndsc213456789的专栏 3126

response.getWriter().write()输出到前台乱码

response输出到前台页面乱码response.getWriter().write()输出中文乱码摸索、探明原因1.思索2.查明解决办法get新技能修改后的代码块如下: response.getWriter().write()输出中文乱码 使用jsp页面调用servlet,执行操作之后返回json字符串,但出现了中文乱码的情况, 如图一: 摸索、探明原因 1.思索 看到这样的输出结果,第一间...

Akatsuki的博客 6599

asp response.write 输出中文乱码 utf-8编码解决方法

asp response.write 输出中文乱码 utf-8编码解决方法 在asp页面头部加:

533

JAVA基础篇-volatile的定义与实现原理

Java语言规范第3版中对volatile的定义如下:Java编程语言允许线程访问共享变量,为了确保共享变量能被准确一致地更新,线程应该确保通过排他锁单独获得这个变量。Java语言提供了volatile,在某些情况下比锁要更加方便。如果一个字段被声明成volatile,Java线程内存模型确保所有线程看到这个变量的值是一致的。 在了解volatile实现原理之前,我们先来看下与其实现原理相关的C...

随便起个不重复的名字 2722

volatile 的实现原理及使用场景

了解volatilevolatile 修饰的使用及实现原理。在java语言规范第三版中对volatile的定义如下:java 编程语言允许线程访问共享变量,为了确保共享变量能被准确一致的更新,线程应该确保通过排它锁单独获得这个变量。也就是当我们访问共享变量,为了确保能正确访问所以需要加上排它锁。而java本身提供了volatile,如果某些字段被修饰成了volatile类型的话没那么java线...

hanmindaxiongdi的博客 915

volatile关键字有什么用?

http://hi.baidu.com/yaolihui/blog/item/a19dc3032d0fa189d43f7cc8.html 恐怕比较一下volatilesynchronized的不同是最容易解释清楚的。volatile变量修饰符,而synchronized则作用于一段代码或方法;看如下三句get代码: int i1;              int g

激情人生 973

java多线程-慎重使用volatile关键字

Java语言包含两种内在的同步机制:同步块(或方法) volatile 变量。这两种机制的提出都是为了实现代码线程的安全性。其中 Volatile 变量的同步性较差(但有它更简单并且开销更低),而且其使用也更容易出错。 public volatile boolean exit = false;在定义exit,使用了一个Java关键字volatile,这个关键字的目的是使exit同步,也就是...

weixin_33795093的博客 203

高校技术转移办公室如何优化科研资源转化路径?.docx

科易网基于40亿+科创知识图谱数据库,深度探索AI技术在技术转移、成果转化、技术经纪、知识产权、产业创新、科技招商等垂直领域的多样化应用场景,研究科技创新领域的AI+数智化解决方案,推动科技创新与产业创新智能化发展。

sam l part1 666niubi

sam l part1 666niubi

上一篇: 提高代码安全性——MISRA工业标准C语言编写规则
下一篇: 内核驱动中断编程顶半部和底半部(上)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值