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

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

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

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

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

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

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

...全文
95 点赞 收藏 5
写回复
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关键字,没发现什么区别,还是不同步
回复
相关推荐
发帖
非技术区
创建于2007-09-28

2.3w+

社区成员

Java 非技术区
申请成为版主
帖子事件
创建了帖子
2019-01-23 10:22
社区公告
暂无公告