java的volatile是什么意思

我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。

这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。

在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。

要解决这个问题,只需要像在本程序中的这样,把该变量声明为volatile(不稳定的)即可,这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下各任务间共享的标志都应该加volatile修饰。

Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。

Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。

这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。

而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。

使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。

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

注:我在单例模式中用到此关键字.

转载于:https://blog.51cto.com/linugb118/412414

Java Volatile keyword相关推荐

  1. [Java并发编程(三)] Java volatile 关键字介绍

    [Java并发编程(三)] Java volatile 关键字介绍 摘要 Java volatile 关键字是用来标记 Java 变量,并表示变量 "存储于主内存中" .更准确的说 ...

  2. volite java_如何理解 JAVA volatile 关键字

    最近在重新梳理多线程,同步相关的知识点.关于 volatile 关键字阅读了好多博客文章,发现质量高适合小白的不多,最终找到一篇英文的非常通俗易懂.所以学习过程中顺手翻译下来,一方面巩固知识,一方面希 ...

  3. java volatile原理A CUP层面

    作者:知乎用户 链接:https://www.zhihu.com/question/49656589/answer/117826278 来源:知乎 著作权归作者所有.商业转载请联系作者获得授权,非商业 ...

  4. Java volatile关键字原理解剖

    Java volatile关键字原理解剖 文章目录 Java volatile关键字原理解剖 参考文章 前置知识 CPU缓存模型 CPU缓存行 并发编程基本概念 Java锁概念 volatile关键字 ...

  5. Java Volatile关键字可见性问题分析

    Java Volatile关键字可见性问题分析 Java 内容模型 普通变量(非Vola变量)的内存不可见性 Volatile变量的内存可见性 剩余疑惑 Java 内容模型 具体可以查看这篇文章Jav ...

  6. Java Volatile 详解

    Java Volatile 详解 Volatile:是java虚拟机提供的轻量级的同步机制.保证可见性.禁止指令重排序.不保证原子性!!! 学习Volatile之前必须了解JAVA内存模型. Java ...

  7. 一个具体的例子学习Java volatile关键字

    相信大多数Java程序员都学习过volatile这个关键字的用法.百度百科上对volatile的定义: volatile是一个类型修饰符(type specifier),被设计用来修饰被不同线程访问和 ...

  8. java volatile 用法_java关键字volatile用法详解

    volatile关键字想必大家都不陌生,在java 5之前有着挺大的争议,在java 5之后才逐渐被大家接受,同时作为java的关键字之一,其作用自然是不可小觑的,要知道它是java.util.con ...

  9. java volatile 多线程_Java多线程之volatile

    在学习Volatile之前有必要简单了解一下物理内存模型和Java的内存模型,这样对理解Volatile大有好处. 寄存器 首先我们要知道的是所有运算操作都是在CPU的寄存器中进行的,而CUP的执行涉 ...

最新文章

  1. ubuntu18.04.1内核升级至5.0.0-25版本
  2. Tomcat的配置及优化
  3. java获取get请求返回_Java中处理调用第三方接口(post/get),该如何处理,返回的数据如何处理...
  4. lua判断字符不为空或空格_Lua判断Table是否为空的方法(空的table即{})
  5. linux 查看namenode进程是否存活:返回namenode进程个数
  6. OpenCV连接的组件Connected Components的实例(附完整代码)
  7. 【STM32】低功耗相关函数和类型
  8. Linux Free命令与cache和buffer的主要区别
  9. 美国大学计算机专业排名2014,2014年美国大学本科计算机专业排名
  10. Java 导入导出Excle表格 两种方式
  11. Java集合框架之三:HashMap源码解析
  12. python实现文件编码转换_Python实现批量转换文件编码的方法
  13. 【算法导论】第5章,概率分析和随机算法
  14. python绘制风玫瑰图_python绘制风向玫瑰图和污染物玫瑰图
  15. 单片机蓝桥杯——超声波测距
  16. 2022-2023年华南师范大学工商管理硕士(MBA)招生简章
  17. 单独二孩政策对中小城镇居民生育意愿影响实践调查报告(20100字)
  18. 建议收藏!可视化系统五大实用的应用场景
  19. 计算机硬件工程师需要学哪些,嵌入式硬件工程师要求是什么?需要掌握哪些内容...
  20. 推荐一个非常不错得网站——精品视频网

热门文章

  1. Spring boot注入配置为java静态属性
  2. Spring Cloud Alibaba 系统保护:微服务架构雪崩效应与服务限流
  3. 软件测试面试总结——常见的面试问题
  4. 这款开源测试神器,圆了我玩游戏不用动手的梦想
  5. pygame做一个简单的打字游戏
  6. ACM寒假训练第一周总结
  7. matlab sperman相关,相关系数
  8. java 拆分类_拆分或不拆分类(用Java)
  9. csrediscore访问redis集群_搭建文档 | centos7.6环境下redis5.0.8集群搭建
  10. 计算机系统验证课件,回顾性验证及再验证简介(ppt 42页)