volatile
作用
- 在多处理器中,保证共享变量的 “可见性”(一个线程修改后,另外一个线程能立即读取到这个最新修改的值)
- 禁止对指令进行重排序
为什么要指令重排
为了消除指令与指令间的等待,在不影响单线程程序执行结果的前提下,尽可能提高并行度。
三大特性
- 原子性
- 有序性
- 可见性
对比 synchronized
- volatile 无法保证原子性
- volatile 不会使线程陷入阻塞,不会引起线程上下文的切换和调度
典型用法
数绵羊程序:
volatile boolean sleep;
while (!sleep) {
countSleep();
}
底层原理
有 volatile
变量修饰的共享变量进行写操作的时候会多出一行以 lock;
指令开头的汇编代码。而 lock;
指令相当于一个内存屏障,其作用如下所示:
- 将当前处理器缓存行的数据写回到系统内存。
- 这个写回内存的操作会使在其他 CPU 里缓存了该内存地址的数据无效。