概述
由于CPU的执行速度要高于内存读取数据的速度,所以将需要运算的数据复制一份到CPU的高速缓存中,也就是给当前运行线程的运行内存的高速缓冲中放入副本。线程第一次运行从主存中将变量拿到高速缓冲中,以后每次线程运行所需变量都从该线程自己的高速缓存中取,而不是从主存中,运算结束后再将高速缓冲中的数据刷新到主存中。
引出问题
- 在并发环境下,由于线程总是从自己的高速缓冲中读取变量,如果主存中的变量已经被其它线程修改,则高速缓存中的值与主存中的值不一致;
- 处理器为了保证程序运行的效率,处理指令的顺序可能不会按代码的先后顺序执行,但是它还是会依靠计算结果的依赖性保证指令重排序后运算的结果与原来相同。
处理问题
- 可见性: 加了volatile的变量表示该变量是不稳定的,所以线程每次是直接从主存中读取,而不是从自己的高速缓冲区中读取了,所以每次取到的都是最新的值;即一个线程对volatile的修改对另一个线程可见;
- 有序性:第三个问题是运行程序的有序性,被volatile修饰的变量不会被重排序,也就是说处理器会按照代码的先后顺序来执行指令,不会进行指令优化。
与同步代码块synchronized的区别
synchronized能保证原子性操作,而volatile不能保证原子性。但缺点是sychronized是属于重量级操作,性能相对更低;
CPU缓存一致性协议MESI
最后
以上就是可耐香菇为你收集整理的对Java中volatile修饰符的理解的全部内容,希望文章能够帮你解决对Java中volatile修饰符的理解所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复