volatile是一个被遗忘的关键字,在开发串行程序当中不会使用,而并行程序当中也不能代替锁(synchronized)(大多数情况下)。但开发当中若然巧妙使用volatile,将避免不必要的加锁操作。
在并行程序开发当中操作变量需要注意两个问题.一个是安全性(正确性),另一个是内存可见性。当多个线程同时操作一个变量时,可以使用锁来保证操作变量的安全性和内存可见性,但若然当操作结果不需要依赖上一个结果,而仅仅只作为一个标识,则可以使用volatile来代替加锁。
以下代码不需要线程安全性,仅仅将变量作为退出线程的标识.但遗憾的是该程序有可能永远无法退出。
package my.concurrent; public class Application { private static boolean flag = false; private static int number; public static void main(String[] args) throws InterruptedException { new Test().start(); Thread.sleep(1000); number = 50; flag = true; } private static class Test extends Thread { @Override public void run() { while (!flag) { System.out.println(number); } } } }
volatile是Java提供的一种稍弱的同步机制,用来增大被修饰变量的内存可见性,从而达到将变量的更新操作通知到其他线程.若然访问volatile修饰的变量将会到主存(堆)当中获取.而不会读取线程的变量副本,被修饰的变量亦不会被缓存到寄存器或者对其他处理器不可见的地方。volatile只承诺被修饰变量的内存可见性,而不保证变量是否被正确的操作,因此volatile从语义或使用上都不能替代锁.因此当遇到以下场景时,可考虑使用volatile。
a.对变量的操作不依赖变量的当前值
b.能确保只有一个线程对其进行修改
c.修改变量不影响程序正确性
总结:在某些情况下使用volatile能避免不必要的加锁操作,尽管有更多或更好的方案代替volatile,但亦可以了解这个关键字的使用方法,必要时多一套解决方案.而在性能方面对比加锁的线程挂起/恢复开销,每次访问变量都需要去主存获取的volatile可以说是忽略不计
相关推荐
详细说明 并举例说明了VOlatile的作用及用法,特别是嵌入式程序员要注意的
java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...
C语言中关键字volatile的作用,使用说明和例子
const和volatile分析 这个分析得很好 面试 找工作 必备的
一般对于volatile的解释是这样的:将变量定义为volatile可以防止编译器对变量进行优化,每次均从内存中访问变量,而不是寄存器。既然让编译器优化可以提高访问速度,那为什么又要不用它以及什么时候不用它?其实主要...
volatile的用法讲解,讲得很详细,希望能帮助到大家
一般说来,volatile用在如下的几个地方: 1、中断服务程序中修改的供其它程序检测的变量需要加volatile; 2、多任务环境下各任务间共享的标志应该加volatile; 3、存储器映射的硬件寄存器通常也要加volatile说明,...
主要讲述java线程volatile关键字
容易忽略的变量声明,但是很重要 volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.
volatile的用法,在写代码正确使用volatile,正确理解volatile的用法,增强代码的健壮性
c语言下关键字的volatile用法,包含一些基本例子
C程序中volatile关键字的使用.方法及其例程介绍。
volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)
讲述了volatile_unsigned_int地址映射的使用说明。
前言Java中volatile这个热门的关键字,在面试中经常会被提及,在各种技术交流群中也经常被讨论,但似乎讨论不出一个完美的结果,带着种种疑惑,准备从JVM、
本文给大家介绍了单片机C语言中volatile的作用。
const,extern,static,volatile的使用
关于volatile变量的介绍 11111111111111111111111111
Java并发编程:volatile关键字解析
C++ volatile 详解