`
tenderuser
  • 浏览: 61368 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

volatile 整理

    博客分类:
  • java
阅读更多
一个定义为volatile的变量是说这变量可能会被意想不到地改变,这样,编译器就不会去假设这个变量的值了。精确地说就是,优化器在用到这个变量时必须每次都小心地重新读取这个变量的值,而不是使用保存在寄存器里的备份 。
volatile关键字是一种类型修饰符,用它声明的类型变量表示可以被某些编译器未知的因素更改,比如:操作系统、硬件或者其它线程等。遇到这个关键字声明的变量,编译器对访问该变量的代码就不再进行优化,从而可以提供对特殊地址的稳定访问。
使用该关键字的例子如下:
 
 int volatile nVint;

  >>>>当要求使用volatile 声明的变量的值的时候,系统总是重新从它所在的内存读取数据,即使它前面的指令刚刚从该处读取过数据。而且读取的数据立刻被保存。
  例如:
  
volatile int i=10;
	  int a = i;
	  ...  //其他代码,并未明确告诉编译器,对i进行过操作
	  int b = i;

  >>>>volatile 指出 i是随时可能发生变化的,每次使用它的时候必须从i的地址中读取,因而编译器生成的汇编代码会重新从i的地址读取数据放在b中。而优化做法是,由于编译器发现两次从i读数据的代码之间的代码没有对i进行过操作,它会自动把上次读的数据放在b中。而不是重新从i里面读。这样以来,如果i是一个寄存器变量或者表示一个端口数据就容易出错,所以说volatile可以保证对特殊地址的稳定访问。
 在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步。这在JVM 1.2之前,Java的内存模型实现总是从主存读取变量,是不需要进行特别的注意的。而随着JVM的成熟和优化,现在在多线程环境下volatile关键字的使用变得非常重要。
 在当前的Java内存模型下,线程可以把变量保存在本地内存(比如机器的寄存器)中,而不是直接在主存中进行读写。这就可能造成一个线程在主存中修改了一个变量的值,而另外一个线程还继续使用它在寄存器中的变量值的拷贝,造成数据的不一致。要解决这个问题,只需把该变量声明为volatile(不稳定的)即可,这就指示JVM,这个变量是不稳定的,每次使用它都到主存中进行读取。一般说来,多任务环境下各任务间共享的标志都应该加volatile修饰。Volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值。而且,当成员变量发生变化时,强迫线程将变化值回写到共享内存。这样在任何时刻,两个不同的线程总是看到某个成员变量的同一个值。
 Java语言规范中指出:为了获得最佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。
 这样当多个线程同时与某个对象交互时,就必须要注意到要让线程及时的得到共享成员变量的变化。而volatile关键字就是提示VM:对于这个成员变量不能保存它的私有拷贝,而应直接与共享成员变量交互。
    使用建议:在两个或者更多的线程访问的成员变量上使用volatile。当要访问的变量已在synchronized代码块中,或者为常量时,不必使用。  由于使用volatile屏蔽掉了VM中必要的代码优化,所以在效率上比较低,因此一定在必要时才使用此关键字。
分享到:
评论

相关推荐

    AVR熔丝位与volatile

    内容是讲解关于AVR熔丝位与其锁死 、解...volatile的应用。新手不容错过! --------------------------------- 声明:所讲内容是本人网上、书上(特别是马潮老师的书)收集与整理并通过实验得来,仅用于学习并非原创!

    尚硅谷JUC视频笔记整理,很详细和全面,帮你迅速掌握JUC

    本笔记整理涉及了JUC的内存可见性、volatile关键字以及CAS算法和原子变量等多个方面,以下是对这些知识点的详细说明。 ### 内存可见性 在多线程环境下,内存可见性是指当一个线程修改了某个共享变量的值,其他线程...

    各企业C语言笔试题整理

    "C语言笔试题整理" 本文档总结了C语言笔试题的知识点,涵盖了预处理指令、宏定义、循环语句、指针、数组、函数指针、关键字static、const、volatile等方面。 1. 预处理指令#define 预处理指令#define可以用来声明...

    java并发整理

    2. **引用的对象可见性**:当一个线程修改了一个指向`volatile`变量的对象引用后,其他线程也能看到新的对象引用及其内容的变化。 3. **程序生命周期事件**:`volatile`变量可以用来标记一些重要的程序生命周期事件...

    JAVA面试整理,吐血整理

    - 并发编程的相关知识点,例如锁机制、原子操作、volatile关键字等,也是面试时经常被问到的内容。 这些知识点涵盖了Java面试中常见的多个方面,掌握这些知识能够帮助面试者在Java相关职位的面试中更加从容应对。...

    Keil C51单片机常见问题整理

    Keil C51单片机常见问题整理 Keil C51单片机C语言编程中的一些常见问题和解释。 1. xdata是什么? xdata是large存储类型,volatile是通过硬件来改变指针指向的内容。在Keil C51中,xdata是指向外部RAM的存储类型...

    FreeRTOS原理与实现整理.pdf

    FreeRTOS原理与实现整理 FreeRTOS是一款轻量级、开源的实时操作系统,广泛应用于嵌入式领域。它具有源码公开、可移植、可裁减、调度策略灵活等特点,可以方便地移植到各种单片机上运行。 任务管理 FreeRTOS提供了...

    JAVA高级知识点整理.rar

    线程同步是多线程编程的关键,包括synchronized关键字、volatile变量、Lock接口(如ReentrantLock)以及各种并发工具类(如Semaphore、CountDownLatch和CyclicBarrier),它们都是为了保证数据的一致性和避免竞态...

    整理多线程面试必问源码知识点.docx

    在Java多线程编程中,`synchronized`关键字和`volatile`关键字是非常重要的概念,它们主要解决了并发环境下的数据同步和可见性问题。下面将详细解释这两个知识点。 ### 一、synchronized `synchronized`是Java中的...

    Java面试题整理

    这份Java面试题整理集合主要涉及Java编程语言、多线程并发、内存管理、网络编程、框架应用和数据库相关知识,下面将详细解释每个知识点。 ### 幂等性 幂等性是指多次执行同一操作与执行一次操作具有相同的效果。...

    java核心技术整理

    Java提供了synchronized关键字、volatile变量、线程池、并发工具类(如Semaphore、CyclicBarrier)等机制,帮助开发者编写安全的多线程程序。 总之,Java核心技术涵盖了广泛的编程概念和实践,从基础语法到高级特性...

    大数据笔记整理.zip

    大数据笔记整理大数据[数据产品]0 如何从0到1构建指标体系1标签体系下的用户画像建设指南2 一文从0到1掌握用户画像知识体系Flink0 流程处理基本概念1 flink基础2次有水印3 网络流控及反压剖析4 flink内存模型5 双流...

    JAVA核心知识点整理

    Java提供了synchronized、volatile、Thread、ExecutorService等工具,理解它们的工作原理和用法,可以编写出高效的并发程序。此外,线程池管理和并发设计模式也是重要知识点。 五、Spring框架 Spring是Java企业级...

    JAVA核心面试知识整理-最全.zip

    这份“JAVA核心面试知识整理-最全.zip”压缩包提供了全面的Java面试准备材料,涵盖了Java基础、Java虚拟机(JVM)、多线程并发以及算法和Java中间件等多个关键领域。 首先,让我们深入Java基础。这部分通常包括Java...

    ARM串口通信的许多整理资料

    #define UTRSTAT0 (*(volatile unsigned long*)0x50000010) #define UTXH0 (*(volatile unsigned char*)0x50000020) #define URXH0 (*(volatile unsigned char*)0x50000024) #define TXD0_READY 0x2 #define RXD0_...

    java面试题整理.zip 阿里腾讯字节华为常见面试题目整理

    - 垃圾回收算法:标记-清除,复制,标记-整理,分代收集等。 - CMS(Concurrent Mark Sweep)和G1收集器的特性。 8. **设计模式** - 单例模式:饿汉式、懒汉式,双重检查锁定等实现方式。 - 工厂模式:简单工厂...

    嵌入式软件开发面试题整理

    "嵌入式软件开发面试题整理" 本资源摘要信息涵盖了嵌入式软件开发面试中常见的问题和知识点,包括关键字volatile、static、const的含义和作用,变量修饰符的区别,函数指针、ISR、中断服务子程序、union和struct的...

    个人资料个人资料个人资料

    5. **多线程**:线程的创建、同步机制、并发控制(synchronized、volatile、Lock等)。 6. **JVM**:垃圾回收机制、内存模型、类加载器、JVM优化技巧等。 7. **设计模式**:单例、工厂、观察者、装饰器等常见设计...

    Java并发编程面试题整理150问

    - volatile保证了共享变量的可见性,线程修改的值会被立即刷新到主内存,其他线程能立即看到变化。 - 它是轻量级的synchronized,减少了锁带来的开销。 - volatile无法保证线程间的原子性,对于复合操作,仍需...

Global site tag (gtag.js) - Google Analytics