用法 volatile string = "a";
线程写volatile变量的过程:
1.改变线程本地内存中volatile变量副本的值
2.将改变后的副本的值从本地内存刷新到主内存
线程读volatile变量的过程:
1.从主内存中读取volatile变量的最新值到线程的本地内存中
2.从本地内存中读取volatile变量的副本
volatile实现内存可见性原理:
写操作时,通过在写操作指令后加入一条store屏障指令,让本地内存中变量的值能够刷新到主内存中
读操作时,通过在读操作前加入一条load屏障指令,及时读取到变量在主内存的值
内存屏障是一种cpu的指令,用于控制特定条件下的重排序和内存可见性问题,
java编译器也会根据内存屏障的规则禁止重排序
volatile 只能保证可见性和有序性,并不能保证原子性
所以它替代不了同步代码块。
* AtomicInteger(原子操作)
用法:public volatile AtomicInteger count = new AtomicInteger(0);