Volatile关键字的作用

定义:词义,易变的, 实质是直接存取原始内存地址

(1)作用

  volatile关键词影响编译器编译的结果,用 volatile声明的变量表示该变量随时可能发生变化,与该变量有关的运算,不要进行编译优化,以免出错

  1.告诉编译器不要做任何优化

  2.用volatile定义的变量会在程序外被改变,每次都必须从原始内存中读取,而不能重复使用放在cache或寄存器中的备份

(2)为什么会可能内改变?

  变量可能被当前代码之外的因素而改变:

  1.中断服务程序中修改的供其它程序检测的变量需要加volatile:中断处理程序isr中更改了这个变量的值

  2.多任务环境下各任务间共享的标志应该加volatile:多线程中在别的线程更改了这个变量的值

  3.存储器映射的硬件寄存器通常也要加voliate:硬件自动更改了这个变量的值(一般这个变量是一个寄存器的值)

(3)几个问题

  1.一个参数既可以是const还可以是volatile吗?

    可以的,例如只读的状态寄存器。它是volatile因为它可能被意想不到地改变。它是const因为程序不应该试图去修改它

  2.一个指针可以是volatile 吗?

    可以,当一个中服务子程序修该一个指向一个buffer的指针时

注意:频繁地使用volatile很可能会增加代码尺寸和降低性能,因此要合理的使用volatile

参考 http://blog.csdn.net/dev_linux/article/details/44829549

时间: 2024-11-04 14:03:48

Volatile关键字的作用的相关文章

多线程中volatile关键字的作用

原文链接:https://blog.csdn.net/xuwentao37x/article/details/27804169 多线程的程序是出了名的难编写.难验证.难调试.难维护,这通常是件苦差事.不正确的多线程程序可能可以运行很多年也不出一点错,直到满足某些临界的条件时,才出现意想不到的奇怪错误. 不用说,编写多线程程序的程序员需要使用可能得到的所有帮助.这期专栏将专注于讨论竞争条件(race conditions)——这通常是多线程程序中各种麻烦的根源——深入了解它并提供一些工具来防止竞争

C语言中volatile关键字的作用

一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度.以上是硬件级别的优化.再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化.编译器优化常用的方法有:将内存变量缓存到寄存器:调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令.对常规内存进行优

java中 static,final,transient,volatile关键字的作用

static 和final static  静态修饰关键字,可以修饰 变量,程序块,类的方法: 当你定义一个static的变量的时候jvm会将将其分配在内存堆上,所有程序对它的引用都会指向这一个地址而不会重新分配内存: 修饰一个程序块的时候(也就是直接将代码写在static{...}中)时候,虚拟机就会优先加载静态块中代码,这主要用于系统初始化:当修饰一个类方法时候你就可以直接通过类来调用而不需要新建对象. final 只能赋值一次:修饰变量.方法及类,当你定义一个final变量时,jvm会将其

Java中volatile关键字的作用

在Java内存模型中,有main memory(主内存)还每个线程各自的线程内存memory(例如:寄存器).为了性能一个线程会在自己memory中保持要访问变量的副本.这样就会出现同一个变量在某一个时刻一个线程内存中的值和其他线程内存或者主内存中的值不一致. 一个变量声明为volatile,就意味着这个变量随时会被其他线程修改,因此不能将他cahe在线程memory中,即:不会再memory中保留他的副本,下面看个例子: public class TestVolatile extends Th

深入解析Java中volatile关键字的作用

Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制在java线程并发处理中,有一个关键字volatile的使用目前存在很大的混淆,以为使用这个关键字,在进行多线程并发处理的时候就可以万事大吉. Java语言是支持多线程的,为了解决线程并发的问题,在语言内部引入了 同步块 和 volatile 关键字机制. synchronized 同步块大家都比较熟悉,通过 synchronized 关键字来实现,所有加上synchronized 和

Linux中volatile关键字的作用

一.前言 1.编译器优化介绍: 由于内存访问速度远不及CPU处理速度,为提高机器整体性能,在硬件上引入硬件高速缓存Cache,加速对内存的访问.另外在现代CPU中指令的执行并不一定严格按照顺序执行,没有相关性的指令可以乱序执行,以充分利用CPU的指令流水线,提高执行速度.以上是硬件级别的优化.再看软件一级的优化:一种是在编写代码时由程序员优化,另一种是由编译器进行优化.编译器优化常用的方法有:将内存变量缓存到寄存器:调整指令顺序充分利用CPU指令流水线,常见的是重新排序读写指令.对常规内存进行优

对Java单例模式 volatile关键字作用的理解

单例模式是程序设计中经常用到的,简单便捷的设计模式,也是很多程序猿对设计模式入门的第一节课.其中最经典的一种写法是: class Singleton { private volatile static Singleton instance;//volatile关键字防止指令重排 private Singleton(){} public static Singleton getInstance() { if ( instance == null ) { //一重判断 synchronized (S

就是要你懂Java中volatile关键字实现原理

原文地址http://www.cnblogs.com/xrq730/p/7048693.html,转载请注明出处,谢谢 前言 我们知道volatile关键字的作用是保证变量在多线程之间的可见性,它是java.util.concurrent包的核心,没有volatile就没有这么多的并发类给我们使用. 本文详细解读一下volatile关键字如何保证变量在多线程之间的可见性,在此之前,有必要讲解一下CPU缓存的相关知识,掌握这部分知识一定会让我们更好地理解volatile的原理,从而更好.更正确地地

volatile关键字及内存可见性

先看一段代码: package com.java.juc; public class TestVolatile { public static void main(String[] args) { ThreadDemo td = new ThreadDemo(); new Thread(td).start(); while(true){ if(td.isFlag()){ System.out.println("----------------"); break; } } } } cla