volatile()
防止指令重排序
只能保证读的原子性,不能保证写的原子性 多线程下会有读后读,造成写的错误
- volatile是一个类型修饰符。
- volatile,它能够使变量在值发生改变时能尽快地让其他线程知道。
- volatile(只保证读)不引起上下文切换 更快
- volatile对线程的内存可见性,禁止指令重排序实现了可见性
- 当对volatile标记的变量进行修改时,会将其他缓存中存储的修改前的变量清除,然后重新读取。
- 不具备原子性(没有达到锁的程度)
- 但是volatile配合上循环cas即可达到锁的程度,保证线程安全
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jQEFRHmC-1678979497342)(E:\学习\图片\Thu, 14 Jul 2022 214022.png)]
原理
加入volatile关键字时,会多出一个lock前缀指令
lock前缀指令实际上相当于一个内存屏障(也成内存栅栏),内存屏障会提供3个功能:
1)它确保指令重排序时不会把其后面的指令排到内存屏障之前的位置,也不会把前面的指令排到内存屏障的后面;即在执行到内存屏障这句指令时,在它前面的操作已经全部完成;
2)它会强制将对缓存的修改操作立即写入主存;
3)如果是写操作,它会导致其他CPU中对应的缓存行无效。