一.使用
volatile是Java虚拟机提供的最轻量级的同步机制,相比与synchronized它更轻量级。如果使用它能满足要求,就应该使用它而不是重量级的synchronized。
volatile用来修饰实例变量、静态变量。
二.语义
2.1.可见性
jvm内存模型,分为工作区和主内存区。线程对变量进行操作时,先将变量拷贝到自己工作内存,修改后再同步回主内存。在线程修改完,还没有同步回主内存时,其它线程是看不到变量的修改的。
而对于volatile修饰的变量,每次在工作内存修改后会强制同步回主内存,并使其它线程的缓存失效(失效后下次读取就要回主内存读取),保持变量的可见性。
2.2.有序性
volatile会禁止‘指令重排序优化’。保证其前边的语句,时间上在其之前执行,其后边的语句时间上在其之后执行。
‘指令重排序优化’可能会调整代码执行的顺序,但保证同样的执行结果。如一些代码调整前后顺序后最后的结果没有不同。
但这在多线程的某些情况下就会出问题。如,《深入理解Java虚拟机》369页的例子。
2.3不保证原子性
对于非原子的操作,如i++,volatile并不能保证i++的结果立马对其它线程可见。
因为i++是分解为三步进行:获取i的值,计算出i+1,将结果写会i。
而如i = 10,这样的赋值操作就是原子操作,volatile可保证这个操作的可见性。
Java并发之基础知识
Java并发之volatile关键字
Java并发之synchronized关键字
Java并发之原子类
Java并发之线程池
Java并发之并发工具类
Java并发之AQS原理
Java并发之ThreadLocal使用和源码分析