Volatile关键字

Volatile

可见性:一个线程修改了变量的值,其他的线程能够及时读到变量修改后的值。多线程之间保证可见性的前提,就是多个线程拿到的是同一把锁
volatile:称为轻量级锁,被volatile修饰的变量,在线程之间是可见的。synchronized也是线程可见的,但synchronized比较重是个重量级锁,虽然实现了轻量级锁和偏向锁,但仍然开销比较大。

volatile如何保证变量的可见性

当前的CPU基本是多核处理器,加了volatile之后时间是在指令上就是多了一句Lock指令,Lock具体就是,在多处理器的系统上

  • 1.将当前处理器缓存行(即CPU的最小缓存单位)的内容写回到系统内存,因为CPU处理之后数据有时并不会马上被写回到内存中,
  • 2.这个写回内存的操作会使在其他CPU里缓存了该内存地址的数据失效

数据存放的地方,按速度排序
硬盘-->内存-->CPU的缓存(CPU缓存也分L3/L2/L1三级缓存).简单来说,数据是保存在硬盘里的,而数据是由CPU来处理的,但由于两者之间速度悬殊,CPU的速度远远大于硬盘的读取速度,所以CPU处理的数据不是直接从硬盘里读取而是从先从内存里读取,当然内存读取的速度仍然远小于CPU处理的速度,所以CPU处理的数据也不是直接从内存中读的,而是将内存的数据放到CPU缓存里的,CPU里L1一级缓存速度最快才是CPU处理直接取数据的地方。

volatile无法保证操作的原子性

虽然volatile能够保证对变量操作的可见性,但当你在对变量做非原子性的操作时比如i=i++时,他并不能保证操作的原子性

volatile与synchronized

synchronized能够完全取代volatile,但反之不能;volatile的作用在于更加轻量化,当只有原子性操作时可以使用volatile来保证,但当操作不是原子性时,volatile则无法保证线程安全

本博客为Swagger-Ranger的笔记分享,文中源码地址: https://github.com/Swagger-Ranger
欢迎交流指正,如有侵权请联系作者确认删除: liufei32@outlook.com

原文地址:https://www.cnblogs.com/Swagger-Ranger/p/10669905.html