前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >volatile 解决了什么问题?

volatile 解决了什么问题?

作者头像
水货程序员
修改2018-11-14 18:22:28
1.8K0
修改2018-11-14 18:22:28
举报
文章被收录于专栏:javathings

volatile 关键字是最常问到的问题,关于这个关键字的作用解释,网上的文章已经多如牛毛了。

简短的总结一下,主要解决 2 个问题。

  • 禁止编译器优化而重排序指令。
  • 对 volatile 修饰的变量值,保证线程读取到的值是最新的,而不是寄存器中缓存的值。

编译器会自作主张的对代码顺序优化,尽管这种优化在大多数场合都是有效的,但是在多线程环境下可能导致不一致的问题。

volatile 修饰的变量,进行写操作时,这个变量将会被直接写入共享内存,而不是线程中缓存。volatile 变量读操作时,直接从共享内存中读,而不是从线程的缓存中读取,保证线程每次读到的都是最新值。也就是保证了内存可见性。

Java 中,long 和 double 都是 64 位的,因此在对于 32 位的操作系统,读写 long 和 double 数据类型会进行 2 次操作,先读写 32 位,再读写 32 位。在多线程情况下,可能读写到一半,这个数值就被使用,导致程序异常。而 volatile 修饰的 long,double 类型,可以保证必须 2 次操作都完成后才可进行下一步操作。某种程度上就是保证了 long,double 数据读写的原子性。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档