用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最新的值。
要了解volatile关键字的作用,首先要先了解JVM在运行时候的内存分配过程。

当线程访问某一个变量的值的时候,首先会在主内存找到对应的变量的值,然后把具体值load到线程自己的工作内存(每个线程都要自己的工作内存,且每个线程不能访问其他线程的工作内存),然后建立一个变量副本,直接修改副本变量的值,最后同步到主内存。
可见性
一旦一个共享变量被volatile修饰之后,保证了不同线程对这个变量进行操作时的可见性。即一个线程修改了某个变量的值,新值对其他线程来说是立即可见的。
有序性
1.当程序执行到volatile变量的读操作或者写操作时,在其前面的操作的更改肯定全部已经进行,且结果已经对后面的操作可见;在其后面的操作肯定还没有进行;
2.在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行。
例子:
//x和y为非volatile变量
//flag为volatile变量
x = 2; //语句1
y = 0; //语句2
flag = true; //语句3
x = 4; //语句4
y = -1; //语句5volatile关键字能保证,执行到语句3时,语句1和2必定是执行完毕的,然后执行语句3,语句3执行完毕后,执行语句4和5。但是语句1和2的顺序、语句4和5的顺序是不作任何保证的。