java并发编程——volatile关键字

271 阅读2分钟

用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;           //语句5

volatile关键字能保证,执行到语句3时,语句1和2必定是执行完毕的,然后执行语句3,语句3执行完毕后,执行语句4和5。但是语句1和2的顺序、语句4和5的顺序是不作任何保证的。


参考资料:Java并发编程:volatile关键字解析