volatile,中文意思是不稳定的、反复无常的,用来修饰变量,和多线程、并发有关系。

Java代码在编译后会变成Java字节码,字节码被类加载器加载到JVM里,JVM执行字节码,最终需要转化为汇编指令在CPU上执行。

在多线程并发编程中 synchronized 和 volatile 都扮演着重要的角色。volatile 是轻量级的 synchronized,它在多处理器开发中保证了共享变量的“可见性”。可见性的意思是当一个线程修改一个共享变量时,另外一个线程能读到这个修改的值。如果 volatile 使用恰当的话,它比 synchronized 的使用和执行成本更低,因为它不会引起线程上下文的切换和调度。

volatile 是如何来保证可见性的呢?对 volatile 修饰的共享变量进行写操作时,观察其汇编指令可发现有一条Lock前缀的指令。这个指令在多核处理器下会引发两件事情:

1)将当前处理器缓存行的数据写回到系统内存。

2)这个写回内存的操作会导致其他处理器的缓存无效。

为了提高处理速度,处理器不直接和内存进行通信,而是先将系统内存的数据读到内部缓存(L1,L2,L3)后再进行操作,但操作完之后不知道何时会写到内存。如果对 volatile 修饰的变量进行写操作,JVM就会向处理器发送一条Lock前缀的指令,将这个变量所在缓存行的数据写回到系统内存。但是,这个时候其他处理器缓存的值还是旧值,再执行计算操作就会有问题。所以,在多核处理器下,为了保证各个处理器的缓存一致,就会实现缓存一致性协议(MESI协议),每个处理器通过嗅探在总线上传播的数据来检查自己缓存的值是不是过期了,当处理器发现自己缓存行对应的内存地址被修改,就会将当前处理器缓存行设置为无效状态,当处理器对这个数据进行写操作时,会重新从系统内存中把数据读到处理器缓存中。

转载于:https://www.cnblogs.com/koushr/p/9302330.html

volatile的应用相关推荐

  1. java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...

    一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...

  2. 从底层吃透java内存模型(JMM)、volatile、CAS

    前言 随着计算机的飞速发展,cpu从单核到四核,八核.在2020年中国网民数预计将达到11亿人.这些数据都意味着,作为一名java程序员,必须要掌握多线程开发,谈及多线程,绕不开的是对JMM(Java ...

  3. volatile关键字之全面深度剖析

    引言 volatile这个关键字可能很多朋友都听说过,或许也都用过.在Java 5之前,它是一个备受争议的关键字,因为在程序中使用它往往会导致出人意料的结果.在Java 5之后,volatile关键字 ...

  4. 嵌入式系统开发过程中遇到的——volatile

    嵌入式 系统开发过程中遇到的-- volatile 对于不同的计算机体系结构,设备可能是端口映射,也可能是内存映射的 .如果系统结构支持独立的 I/O 地址空间,并且是端口映射,就必须使用汇编语言完成 ...

  5. c语言中volatile关键字的作用

    读文章之前 可以先看一下<程序员的自我修养 >第28页 过度优化. volatile 提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直 ...

  6. C语言volatile关键字详解

    volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储 ...

  7. 你真的掌握了并发编程volatile synchronized么?

    先看代码: import java.util.concurrent.atomic.AtomicInteger;/**** @author xialuomantian*/ public class Ne ...

  8. Java使用字节码和汇编语言同步分析volatile,synchronized的底层实现

    关于怎么查看字节码的五种方法参考本人另一篇文章<Java以及IDEA下查看字节码的五种方法> 查看汇编语言汇编码 说要看汇编还是很有必要的,因为有些地方比如加锁其实还是通过汇编实现的,只看 ...

  9. C++中关键字volatile和mutable用法

    C/C++中的volatile关键字和const对应,用来修饰变量,用于告诉编译器该变量值是不稳定的,可能被更改.使用volatile注意事项: (1). 编译器会对带有volatile关键字的变量禁 ...

  10. volatile - 如何实现线程安全

    2019独角兽企业重金招聘Python工程师标准>>> volatile关键字,在我之前的博客 Volatile - 用途 中已经简单讲解过,当时提出了volatile在多线程中是不 ...

最新文章

  1. AbutionGraph:构建以知识图谱为核心的下一代数据中台
  2. 从 LRU Cache 带你看面试的本质
  3. 软件架构中的分层技术
  4. python语言下载-python下载_python免费下载[编程工具]-下载之家
  5. mysql 函数索引_MySQL 8.0 索引特性1-函数索引
  6. xshell进行ssh链接报错“所选的用户密钥未在远程主机上注册”处理
  7. 科大星云诗社动态20211214
  8. Linux 系统启动流程图/系统初始化流程图
  9. 浅释一下,为什么要使用接口?
  10. 腾讯游戏规范直播:以后将严禁这些行为!
  11. mysql gps海拔表_GPS海拔表
  12. ElasticSearch启动报错,报ERROR: [3] bootstrap checks failed
  13. mybatis动态列名
  14. (转)国外优秀区块链创业公司梳理
  15. 中国石油大学--生活学习简易FAQ
  16. stagefright
  17. 一文搞懂SPI通信协议
  18. 《操作系统》课程设计任务书
  19. 阿里云弹性计算首席架构师分享云上应用架构演进三大方向
  20. 联盟链系列 - 中间CA颁发证书

热门文章

  1. mysql and 和where,关于mysql:连接sql查询中where和and子句的区别
  2. 复化科特斯公式matlab_matlab实现复化NewtonCotes公式求积分的程序应用和代码
  3. 霍纳法树形流图中处理机p个数_处理机管理(进程管理)
  4. mysql alter table if_MySQL中的alter table命令的基本使用方法及提速优化
  5. leetcode13. 罗马数字转整数
  6. C++类模板template <class T>简单使用方法
  7. 三种钱非常奥妙 花越多就赚越多
  8. mplayer 所支持的音视频编解码
  9. 解决: Failed to execute ... maven-deploy-plugin... Return code is: 401, ReasonPhrase: Unauthorized.
  10. 操纵浏览器历史记录 : popstate() 、 history.pushState() 、 window.history.pushState()