关键字volatile的作用主要有两个。
1.关键字volatile使变量在多个线程间可见
Java内存模型分为工作内存和主内存。工作内存是线程的私有堆栈,主内存是所有线程共享的公共堆栈。根据Java的内存的内存模型,一个变量会存在公共堆栈和线程的私有堆栈中。每次变量的最新值都是公共变量的值,不使用volitale时取得的可能是私有堆栈中的值,私有堆栈的值在读取之前需要和公共堆栈的值进行同步,如果读取私有堆栈值的时候私有堆栈值还没有和公共堆栈值同步,那么从私有堆栈中取得的值就是过期的值,这时就会发生读取数据不一致的问题。
为了解决这个问题,可以给待访问的变量加上volatile关键字。当线程访问一个变量时,如果该变量使用volatile关键字,那么JVM就会强制从公共堆栈中取得变量的值,而不是从线程私有数据栈中取得变量的值。volatile关键字解决线程私有堆栈中数据和公共堆栈中的数据不同步的问题。
volatile的用法就在是要访问的变量的前面加一个volatile关键字修饰,如:
volatile private boolean isRunning = true;
不使用volitale关键字和使用volitale关键字读取变量时,从内存中获取数据的方式的变化如图:
图(1)不使用使用volitale关键字读取变量