其他分享
首页 > 其他分享> > 理解 volatile 关键字

理解 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 等于 原子性吗?

我们换个说法,就是volatile 修饰的变量线程安全吗? 答案是否定的!

我们注意思考上的概括,说的是高速缓存中的变量是相同的,没有说已经被寄存器复制的变量副本!!

假设 i == 1 在主存中,现在需要对 i 自增 1 两次,我们采用了两个线程来运行,时间顺序如下

好的,看到问题了,自加了两次的结果等于2 线程不安全!!

那 volatile 有什么用?

可见性并不能解决线程安全问题啊??,加了还不如不加?

其实不然

问题

Java 多线程在单核CPU,volatile 是否还有必要呢?

如果高速缓存区多个线程共享

参考

java多线程在单核CPU上,还是需要volatile synchronized吗?

Java内存模型(JMM)总结

标签:主存,t2,关键字,理解,volatile,寄存器,线程,高速缓存
来源: https://www.cnblogs.com/gingo/p/14983557.html