理解高并发(19).volatile原理及用法

来源:互联网 发布:海绵软件 编辑:程序博客网 时间:2024/06/05 15:52
功能
volatile关键字有2大作用,
  • 保证被修饰的语句在执行和编译时不被优化
下面的例子,如果不加volatile,执行器对stop的取值仅从本地工作内存中获取,这样的话会造成即使该值被其它线程修改无无从感知。
专业点讲:禁止指令重排序
  • 保证线程能够获取到最新值
如果增加volatile修饰,每次都从主存中获取,可以取到最新值.
专业点讲:保证可见性

原理
其实底层实现也很简单, 就是在指令的前面增加一个lock,也称内存(屏障)栅栏,内存栅栏能保证:
      1、栅栏前面的指令不能在栅栏后面的指令之后执行
      2、值修改后要求立刻被回写主存
      3、在写操作时,其它线程必须等待写完成

示例源码
public class VolatileTest {
/**
* 如果 stop变量上不加volatile修饰, 程序不能正常退出
* 增加volatile修饰后, 当stop值修改后, 其它线程能够立马感知得到。
*/
private static boolean stop = false;
public static void main(String[] args) throws Exception {
Thread workThread = new workThread();
workThread.start();
TimeUnit.SECONDS.sleep(2);
System.out.println("Stop Thread");
stop = true;
}
static class workThread extends Thread{
public void run() {
int i = 0;
while (!stop) {
i++;
//如果在这增加System.out.println(); 输出,则能够正常退出
//原因是因为System.out.println 做了同步,而每次同步都会刷新一次
//内存
}
System.out.println("work thread is over");
}
}
}