volatile 的作用
- 主要的作用是让编译器不要优化当前修饰的这个变量,让CPU通过访问内存的方式读取这个变量
- 问题来了,明明是优化,为什么还要去禁止它
- 这就涉及到CPU访问变量的工作原理
- 在计算机中,访问寄存器的速度要比访问内存快得多
- CPU访问寄存器的机制是这样的
- CPU访问内存的机制是这样的
- 先找到数据的指针,这玩意可能存放在寄存器中,所是走了一次读寄存器的操作
- 然后将指针送去内存管理单元(MMU),将这个虚拟的地址转换为真实的物理地址
- 然后将物理地址送去内存控制器,找出这个地址在哪一条内存上
- 然后确定数据在这条内存的哪一个块上
- 然后从这个块读取数据
- 然后将数据送去内存控制器
- 最后送回CPU
- 可以看出访问内存的步骤还是挺多的,导致慢
- 然后如果频繁读取的话,效率就会很低
- 所以编译器就会执行优化,将频繁用到的变量放到寄存器,然后CPU就可以直接读取
- 但是,变量有可能因为未知的因素被修改,比如操作系统,硬件,其他线程,然后如果这个时候还去寄存器里读取的话,那么读出来的就是脏数据,所以为了避免这种情况,如果变量可能被意外修改的话,就使用
volatile 修饰,一般这样的变量有多线程共享的全局变量