Volatile关键字作用
目录
1. 保证变量对所有线程的可见性
当一个变量被声明为volatile的时候,它会保证对这个变量的写操作会立即刷新到主存中,而对这个变量的读操作会直接从主存中读取,从而确保了多线程环境下对该共享变量访问的可见性。这意味着一个线程修改了volatile变量的值,其它线程能够立刻看到这个修改,不会受到各自线程工作内存的影响。
2. 禁止指令重排序
volatile关键字在java中主要通过内存屏障来禁止特定类型的指令重排序‘
写写屏障
在 对volatile变量执行写操作之前,会插入一个写屏障,确保了在该便写操作之前的所有普通写操作都已完成,防止了这些写操作被移到volatile写操作之后。
读写屏障
在对volatile变量执行读操作后,会插入一个读屏障,它确保了对volatile变量的读操作之后的所有普通读操作都不会被提前到volatile读之前执行,保证了读到的数据都是最新的。
写读屏障
发生在volatile写之后和volatile读之前,这个屏障确保了volatile写操作之前的所有内存操作都不会被重排序到,也确保了volatile读操作之后的所有内存操作都不会被重排序到volatile写之前。