我来告诉大家什么是volatile关键字

哈希塞特 2019-01-23 10:22:11
百度:
1.内存可见性;
2.禁止指令重排序。
这么底层的专业解释谁能看得懂?

换个思路:
redis应该大部分人都用过,当一个查询很频繁的时候,可以把数据缓存到redis,
这样查询直接走缓存,不查数据库了。

当你修改了数据库记录后,会造成与redis中的数据不一致,这就需要在你修改
数据库的同时,要么同时更新缓存,要么直接把缓存清空,下次查询会自动同步缓存。

再来看看volatile:
cpu正常情况下不和内存交互而是和高速缓存打交道,这里内存就相当于宏观上的数据库,
高速缓存就相当于宏观上的redis。

java中,volatile修饰的变量被某个线程改变后,需要将新值强制写回主存(JMM主存
就认为是内存,当然物理上对应关系很复杂),这就相当于数据库的记录改变了,而缓存
中的数据仍然是旧数据,不一致了怎么办?要么同步要么清空,把cpu高速缓存数据同步
估计没有厂商会这么干,那就直接清空缓存吧!对,volatile就是干这个事的。

高速缓存一般有3级,有的是两级。一般前两级在cpu内部,后一级在外部,应该在主板上。

...全文
228 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
专注写bug 2019-11-26
  • 打赏
  • 举报
回复
我最近在研究总结各项volatile
https://blog.csdn.net/qq_38322527/article/details/103235148
十八道胡同 2019-01-23
  • 打赏
  • 举报
回复
Coder-YangMo 2019-01-23
  • 打赏
  • 举报
回复
加入volatile关键字之后,产生汇编代码之后,在该位置会有一个lock前置指令,相当于内存屏障,该屏障提供三个功能:
1:确保指令重排序时,不会将屏障前的操作排到屏障后,也不会将后边的操作排到屏障前。
2:强制对缓存的修改立即写入内存;
3:如果是写操作,让其他cpu对应的缓存无效;
volatile保证可见性,保证一定的有序性,无法保证所有变量的原子性。
别闹腰不好 2019-01-23
  • 打赏
  • 举报
回复
xiao_lone 2019-01-23
  • 打赏
  • 举报
回复
有没有测试的case可以贴出来,最近在看这个多线程,加上volatile关键字,没发现什么区别,还是不同步

23,405

社区成员

发帖
与我相关
我的任务
社区描述
Java 非技术区
社区管理员
  • 非技术区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧