用volatile修饰的变量,线程在每次使用变量的时候,都会读取变量修改后的最新的值。html
要了解volatile关键字的做用,首先要先了解JVM在运行时候的内存分配过程。编程
当线程访问某一个变量的值的时候,首先会在主内存找到对应的变量的值,而后把具体值load到线程本身的工做内存(每一个线程都要本身的工做内存,且每一个线程不能访问其余线程的工做内存),而后创建一个变量副本,直接修改副本变量的值,最后同步到主内存。bash
一旦一个共享变量被volatile修饰以后,保证了不一样线程对这个变量进行操做时的可见性。即一个线程修改了某个变量的值,新值对其余线程来讲是当即可见的。并发
1.当程序执行到volatile变量的读操做或者写操做时,在其前面的操做的更改确定所有已经进行,且结果已经对后面的操做可见;在其后面的操做确定尚未进行;优化
2.在进行指令优化时,不能将在对volatile变量访问的语句放在其后面执行,也不能把volatile变量后面的语句放到其前面执行。spa
例子:线程
//x和y为非volatile变量
//flag为volatile变量
x = 2; //语句1
y = 0; //语句2
flag = true; //语句3
x = 4; //语句4
y = -1; //语句5复制代码
volatile关键字能保证,执行到语句3时,语句1和2一定是执行完毕的,而后执行语句3,语句3执行完毕后,执行语句4和5。可是语句1和2的顺序、语句4和5的顺序是不做任何保证的。code
参考资料:Java并发编程:volatile关键字解析cdn