专栏首页javathingsvolatile 解决了什么问题?

volatile 解决了什么问题?

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

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

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

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

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

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

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 深入理解Android:WebKit卷(移动开发)

    全书一共11章:第1章介绍了Android源代码阅读与编译环境的搭建;第2章介绍了浏览器的通用工作原理以及WebKit的架构设计;第3章深入解析了WTF的实现原...

    用户3157710
  • jsp 自定义标签解决jsp页面中int时间戳的时间格式化问题

    之前在项目中根据需求,需要自定义标签,经过查询w3c文档,自己也踩了一些坑,特此记录自定义标签的步骤,下面就以我之前的一个例子中的定义一个时间转换标签为例:gi...

    lin_zone
  • 冒号课堂:编程范式与OOP思想

    《冒号课堂》以课堂对话的形式,借六位师生之口讲述编程要义。上篇对编程范式作了入门性的介绍,并对一些流行的编程语言进行了简评;下篇侧重阐发软件设计思想,其中在范式...

    用户3157710
  • HTML5实战

    作为Web开发领域里发展最快的技术之一,HTML5凭借其动态特性及跨平台特性日益成为程序设计领域备受推崇的语言。作为一门新兴语言,HTML5的应用范畴远远不止移...

    用户3157710
  • 超实用的JavaScript代码段 (代码逆袭)

    《超实用的JavaScript代码段》基于实用、实践、前瞻性、学习的原则,笔者精选了近300段JavaScript代码和400种解决方案,覆盖了几乎所有的脚本处...

    用户3157710
  • 转型架构师之路——郑天民

    架构师是一个综合性的角色,需要熟练掌握架构设计方法和开发技术,同时具备良好的组织管理能力。在第2篇《深入剖析架构师角色》中我们分析了架构师的主要职责和所开展的活...

    Java天坑
  • Java编程思维

    本书从基本的编程术语入手,用代码示例诠释计算机科学概念,旨在教会读者像计算机科学家那样思考,并掌握解决问题这一重要技能。书中内容共分为14章、3个附录,每章末都...

    用户3157710
  • 《操作系统概念:JAVA实现》

    当今的操作系统如何工作?Abraham Silberschatz、Peter Baer Galvin和Greg Gagne将带你尽快了解计算机操作系统的所有关键...

    用户3157710
  • KVM 虚拟化技术

    在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等...

    惨绿少年
  • [现代编译原理C语言描述].(美国)Andrew.W.Appel.清晰版

    《现代编译原理:C语言描述》全面讲述了现代编译器的结构、编译算法和实现方法,是Andrew w.Apple的“虎书”——Modern Compiler Impl...

    用户3157710

扫码关注云+社区

领取腾讯云代金券