Java volatile关键字的作用
对一个变量添加volatile修饰,可以实现以下功能:
- 对这个变量的修改都会即时被写回内存,保证任何其他线程在读取的都是都读到的是实时值;
Java中,变量都是保存在主内存中的,当线程访问变量时,都是从主内存拷贝一份到自己的工作内存,修改完值后再写回主内存。使用volatile可以保证线程在修改后,其他线程可以及时的读到新值。 - 不保证原子性;
读取-修改-写入为非原子性操作,有可能A线程在写入的过程中,B线程也要写入,此时即使加入了volatile,但是由于读-修改的过程已完成,线程B不再从内存拿数据,导致线程B覆盖了A的修改。 - 该变量的代码不会被重排。
在对被volatile修饰的变量进行访问时,会在前加上一个内存屏障的语句,使其前后的指令不会被顺序更改。
volatile可以保证单个操作的原子性,但是像i++这种操作,不是原子性的,就不能实现线程安全。