# volatile 关键字
volatile
关键字最重要的两点功能点是:防止JVM的指令重排和保证变量的内存可见性。
volatile 实现原理
简单的说当把变量声明为volatile
时,JVM认为这个变量是共享且不稳定的,每次使用它都到主存中进行读取。
这里重点要理解 CPU 缓存模型,具体原理,有机会在深入研究。
# 并发编程的三个重要特性
- 原子性: 一个的操作或者多次操作,要么所有的操作全部都得到执行并且不会收到任何因素的干扰而中断,要么所有的操作都执行,要么都不执行。
synchronized
可以保证代码片段的原子性。 - 可见性:当一个线程对共享变量进行了修改,那么另外的线程都是立即可以看到修改后的最新值。
volatile
关键字可以保证共享变量的可见性。 - 有序性:代码在执行的过程中的先后顺序,
Java
在编译器以及运行期间的优化,代码的执行顺序未必就是编写代码时候的顺序。volatile
关键字可以禁止指令进行重排序优化。
# synchronized 和 volatile 的区别
synchronized
关键字和 volatile
关键字是两个互补的存在,而不是对立的存在!
volatile
关键字主要用于解决变量在多个线程之间的可见性,而synchronized
关键字解决的是多个线程之间访问资源的同步性。volatile
关键字是线程同步的轻量级实现,所以volatile
性能肯定比synchronized
关键字要好。但是volatile
关键字只能用于变量而synchronized
关键字可以修饰方法以及代码块。volatile
关键字能保证数据的可见性,但不能保证数据的原子性。synchronized
关键字两者都能保证。