volatile的使用时机
编译器在把源程序编译为目标代码的时候,通常都会做一些优化。例如,对于一些变量的存放而言,为了提高存取的效率,编译器有时会先把变量读取到一个寄存器中缓存起来,当以后再取变量值时,就直接从寄存器中取值,而不需要再从内存中去读取。在单线程环境下,这样的优化能显著提高程序的运行效率;但是,在多线程环境下就会有潜在的风险。假设一个线程1和线程2共享的变量sharedObj,如果在线程1中把sharedObj缓存在寄存器中,那么当线程2对内存中sharedObj的值进行修改后,线程1无法读取到这个最新的值,因为线程1会从寄存器中读取,而不会从内存中读取。由此可见,在多线程编程的环境下,编译器的优化有可能会带来潜在的问题。volatile恰恰可以解决这个问题。
volatile的作用
volatile是一个类型修饰符(type specifier),用来修饰被不同线程访问和修改的变量。被volatile类型修饰的变量,系统每次用到它的时候都是直接从对应的内存中读取,而不会利用cache中原有数值,系统对这种变量的处理不会做优化。所以,volatile一般用于修饰多线程间被多个任务共享的变量和并行设备硬件寄存器等。