当前位置: 首页 > news >正文

Java中的volatile关键字-转载

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

    关于volatile,我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。要解决这个问题,只需要像在本程序中的这样,把该变量声明为volatile(不稳定的)即可这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下各任务间共享的标志都应该加volatile修饰

    Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。 
    Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。 
    这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。 
    而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。 
    使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。 

由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。

转自http://www.blogjava.net/klpk222/archive/2007/11/21/162039.html

转载于:https://my.oschina.net/smalant/blog/39616

相关文章:

  • jsp---EL存取器
  • 如何可以导入注册表文件时不提示?
  • 第八章异常和断言
  • VC++播放音频文件和音频数据的方法
  • ubuntu ftp服务器配置(转)
  • shell算数运算
  • 集线器、路由器、交换机、第三层交换技术
  • Slideshow ad
  • 13.6.1 新添加一个界面(Adding One Interface)
  • asp.net 机试题1
  • 第二节 1面向对像简介
  • basic4android 开发教程翻译(八)使用ListView
  • 虚拟机安装Linux怎么使桌面铺满虚拟机
  • xml.exist() 实例演示
  • CentOS 5.5 使用 EPEL 和 RPMForge 软件库
  • 【知识碎片】第三方登录弹窗效果
  • 2017-09-12 前端日报
  • React-redux的原理以及使用
  • Service Worker
  • spring cloud gateway 源码解析(4)跨域问题处理
  • spring security oauth2 password授权模式
  • Vue.js-Day01
  • webpack项目中使用grunt监听文件变动自动打包编译
  • weex踩坑之旅第一弹 ~ 搭建具有入口文件的weex脚手架
  • 看域名解析域名安全对SEO的影响
  • 使用parted解决大于2T的磁盘分区
  • 微信开放平台全网发布【失败】的几点排查方法
  • 为什么要用IPython/Jupyter?
  • 用Visual Studio开发以太坊智能合约
  • 看到一个关于网页设计的文章分享过来!大家看看!
  • 1.Ext JS 建立web开发工程
  • 我们雇佣了一只大猴子...
  • #QT(TCP网络编程-服务端)
  • #前后端分离# 头条发布系统
  • $refs 、$nextTic、动态组件、name的使用
  • (30)数组元素和与数字和的绝对差
  • (C语言)fgets与fputs函数详解
  • (vue)页面文件上传获取:action地址
  • (ZT)出版业改革:该死的死,该生的生
  • (八)Spring源码解析:Spring MVC
  • (非本人原创)史记·柴静列传(r4笔记第65天)
  • (附源码)springboot宠物医疗服务网站 毕业设计688413
  • (更新)A股上市公司华证ESG评级得分稳健性校验ESG得分年均值中位数(2009-2023年.12)
  • (六)库存超卖案例实战——使用mysql分布式锁解决“超卖”问题
  • (实战篇)如何缓存数据
  • (小白学Java)Java简介和基本配置
  • (转)linux 命令大全
  • . ./ bash dash source 这五种执行shell脚本方式 区别
  • .NET 应用启用与禁用自动生成绑定重定向 (bindingRedirect),解决不同版本 dll 的依赖问题
  • .NET3.5下用Lambda简化跨线程访问窗体控件,避免繁复的delegate,Invoke(转)
  • .netcore 获取appsettings
  • .NET平台开源项目速览(15)文档数据库RavenDB-介绍与初体验
  • :如何用SQL脚本保存存储过程返回的结果集
  • @JoinTable会自动删除关联表的数据
  • @Query中countQuery的介绍