大多数场景下volatile的开销要比锁要低, 因为锁有优化,所以不是很确定.
加volatile的变量与普通变量比性能几乎没有差别,只是在写操作上因为加入了内存屏障禁止乱序执行而会慢上一些.
作用
1.
保证此变量对所有线程的可见性
2.
禁止指令重排列优化 ( 通过加入内存屏障 )
原理
•
每次使用变量之前都必须到主内存读取最新的值.
•
每次修改变量后都必须立刻写回主内存.
可见性
volatile变量对所有线程都是可见的, 对volatile变量的所有操作都会立刻反映到其它线程中.
线程不安全
因为会有,穿插执行 会有并发修改.
即使是最简单的 a++; 操作对应的指令也不是一条,也会线程不安全.
使用前提
•
运算结果不依赖变量的当前值, 或者能够确保只有一个线程修改变量的值.
•
变量不需要与其他的状态变量共同参与不变约束
比如控制线程停止的命令就可以用volatile修饰
volatile boolean shutdown=false;
while(!shutdown){}
shutdown = true;
指令重排
在读取配置后把 配置设置为true来表示配置读取完成. 这句就有可能出错,
线程 A :
配置读取解析
initialized = true;
线程 B :
while(!initialized)
sleep();
通过给initialized 变量加上volatile修饰符来解决
评论区