欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 锐评 > Volatile的相关内容

Volatile的相关内容

2026/2/2 0:38:36 来源:https://blog.csdn.net/tay8799/article/details/148211806  浏览:    关键词:Volatile的相关内容

首先补充几个知识点:

内存可见性

举一个例子:

终端:

分析:t2线程没问题,问题在于t1。1!=0,t1应该结束才对。

·t2改了flag,t1没有看见。   t2是写入,t1是读取

·flag变量的修改对于t1线程不可见

编译器优化

·大多数情况是可以做到逻辑不变并对代码优化调整,提高效率,但一些特定场景可能会出现误判

比如这个过程:load(拿数据--读内存),cmp(比较--寄存器操作),load,cmp 反复执行,在反复执行中拿到flag一样;但是load比cmp耗时多---读内存比读寄存器效率慢得多。此时load读到的值一样,编译器直接把从内存读取flag这个操作优化掉了。

·编译器不是看不见改变,而是不知道另外一个线程的他flag修改代码能不能执行以及啥时候执行。

        --用户输入啥,编译器无法预计。

volatile解决内存可见性引起的线程安全问题

关键字修饰变量:

·提醒JVM在读写volatile变量指令前后添加“内存屏障相关的指令“

结合java内存模型 --- JMM

·一个java进程会有一个“主内存”存储空间

·每个java线程又有自己的“工作内存”存储空间---其实不是内存,是存储介质

       -再深层一点,在操作系统分析,“工作内存”中不仅有寄存器,还有缓存,(缓存有很多层)

·上方的代码例子,t1进行flag变量的判定,先把flag值从主内存读到工作内存,用工作内存中的值进行判定。同时t2对flag进行修改,修改的是主内存的值,主内存的变更不会影响到t1的工作内存

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com