大佬教程收集整理的这篇文章主要介绍了理解 volatile 关键字,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
This means that changes to a volatile variable are always visible to other threads. what's more, it also means that when a thread reads a volatile variable, it sees not just the latest change to the volatile, but also the side effects of the code that led up the change.
官方的描述只看懂了,前半部分,意思是,volatile 修饰的变量总是对其他线程是可见的,后半部分理解不了,不过没关系我们继续探索。
说到可见性需要对 JMM 模型 和 硬件内存架构 有所了解
可以看一下 JMM 和 硬件内存架构 的内容
上图就是 现代硬件内存架构,我们围绕这个来讨论可见性
如果在单线程环境下没有问题,但是在多线程环境下,就会导致一个问题,在不同的线程中高速缓存中 i 的值会出现不一致,
即 在线程 t1 计算完 +1 操作但是还没刷回主存这段时间之前 t2 获取到值还是原来的 i
所以就有了 volatile ,它的作用是 如果线程 t1修改了 i,会马上刷回主存,并且其他线程中高速缓存中的 i 值失效,需要重新从主存中加载,这样就所有线程中的高速缓存 i 值都是一样的
volatile 修饰的变量就是让所有线程中的高速缓存中该变量都是相同值
我们换个说法,就是volatile 修饰的变量线程安全吗? 答案是否定的!
我们注意思考上的概括,说的是高速缓存中的变量是相同的,没有说已经被寄存器复制的变量副本!!
假设 i == 1 在主存中,现在需要对 i 自增 1 两次,我们采用了两个线程来运行,时间顺序如下
好的,看到问题了,自加了两次的结果等于2 线程不安全!!
可见性并不能解决线程安全问题啊??,加了还不如不加?
其实不然
如果高速缓存区多个线程共享
参考
java多线程在单核CPU上,还是需要volatile synchronized吗?
Java内存模型(JMM)总结
以上是大佬教程为你收集整理的理解 volatile 关键字全部内容,希望文章能够帮你解决理解 volatile 关键字所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。