一.什么是volatile,它的作用是什么
我们知道线程安全的三大核心就是原子性、可见性和顺序性,synchronized可以实现原子性,而volatile就是来实现可见性。
那么什么是可见性呢?
我们知道,在现代计算机中,由于 CPU 直接从主内存中读取数据的效率不高,所以都会对应的 CPU 高速缓存,先将主内存中的数据读取到缓存中,线程修改数据之后首先更新到缓存,之后才会更新到主内存。如果此时还没有将数据更新到主内存其他的线程此时来读取就是修改之前的数据。而在多线程的情况下,可能会导致变量的值改变,与实际的值不符,而缓存里的值是不会改变的。所以应当保证在多线程的情况下,变量的值得改变要同步,volatile保证了每次值都从内存中获取。
可见性就是指当多个线程访问同一个变量时,一个线程修改了这个变量的值,其他线程能够立即看得到修改的值。
这里列举一个例子:
//线程一执行的代码
int i=0;
i=10;
//线程二执行的代码
int j=i;
- volatile 关键字就是用于保证内存可见性,当线程A更新了 volatile 修饰的变量时,它会立即刷新到主线程,并且将其余缓存中该变量的值清空,导致其余线程只能去主内存读取最新值。
- 使用 volatile 关键词修饰的变量每次读取都会得到最新的数据,不管哪个线程对这个变量的修改都会立即刷新到主内存。
-
volatile不会引起线程上下文切换和调度,所以它可以理解为是轻量级的synchronized。