侧边栏壁纸
  • 累计撰写 781 篇文章
  • 累计创建 1 个标签
  • 累计收到 1 条评论
标签搜索

Volatile

Dettan
2021-07-10 / 0 评论 / 0 点赞 / 93 阅读 / 576 字
温馨提示:
本文最后更新于 2022-04-30,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。
大多数场景下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修饰符来解决
0

评论区