并发 - volatile

volatile

作用

  • 多处理器中,保证共享变量的 “可见性”(一个线程修改后,另外一个线程能立即读取到这个最新修改的值)
  • 禁止对指令进行重排序

为什么要指令重排

为了消除指令与指令间的等待,在不影响单线程程序执行结果的前提下,尽可能提高并行度

三大特性

  • 原子性
  • 有序性
  • 可见性

对比 synchronized

  • volatile 无法保证原子性
  • volatile 不会使线程陷入阻塞,不会引起线程上下文的切换和调度

典型用法

数绵羊程序:

volatile boolean sleep;

while (!sleep) {
    countSleep();
}

底层原理

volatile 变量修饰的共享变量进行写操作的时候会多出一行以 lock; 指令开头的汇编代码。而 lock; 指令相当于一个内存屏障,其作用如下所示:

  • 将当前处理器缓存行的数据写回到系统内存。
  • 这个写回内存的操作会使在其他 CPU 里缓存了该内存地址的数据无效。