1、volatile特性
- 可见性:对一个volatile的读总能看到(任意线程)对这个volatile变量最后的写入。
- 原子性:任意单个volatile变量的读/写具有原子性,但是类似volatile++这样的复合操作不具有原子性。
2、volatile的内存语义
当写一个volatile变量时,JMM会把该线程对应的问题内存中的共享变量刷新到主内存中。
当读一个volatile变量时,JMM会把该线程本地内存置为无效。线程接下来将从主内存中读取共享变量。
为了实现volatile的内存语义,编译器在生成字节码时,会在指令序列中插入内存屏障,禁止特定类型的处理器重排序。
- volatile写操作的前面插入storestore屏障,禁止上面的普通写和下面的volatile写重排序。
- volatile写操作后面插入storeload屏障,禁止上面的volatile写操作可能与下面存在的volatile读/写操作重排序。
- volatile读操作后面插入loadload屏障,禁止下面所有的普通读操作与volatile读操作重排序。
- volatile读操作后面插入loadstore屏障,禁止下面所有的普通写操作与上面的volatile操作重排序。