java并发编程——volatile关键字

用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

相关文章
相关标签/搜索