并发编程系列之volatile关键字详解

1、volatile是什么?

首先简单说一下,volatile是什么?volatile是Java中的一个关键字,也是一种同步机制。volatile为了保证变量的可见性,通过volatile修饰的变量具有共享性。修改了volatile修饰的变量,其它线程是可以读取到最新的值的

2、并发编程的三大特性

并发编程有三个重要特性:原子行、可见性、有序性

原子性:原子性是指一个或者多个操作,要么全部执行且执行过程不会被其它操作打断,要么全部不执行。
可见性:可见性是指共享变量对于多个线程都是可见的,也即一个线程修改了变量,其它线程马上就能知道
有序性:有序性是指程序的执行顺序按照代码的先后顺便执行

3、什么是指令重排序?

假如我们写一个程序,我们会期待这些语句的实际执行顺便和代码的顺序是一致的,大部分情况是一致的,但实际上,编译器、JVM 或者 CPU 都有可能出于优化等目的,对执行的顺序进行调整,这个就是指令重排序

  • 重排序的好处:提高处理速度

代码顺序如图:

指令重排后,a=100; a= a+100会提到一起执行,效率提高

上面的例子,是可以提高执行效率,但是有时候指令重排是会导致问题的,如下代码例子,代码顺序是先初始化content,然后设置标识为true,线程B检测到为true之后,调用content的方法

如果指令重排后,这种情况就会出现没初始化完成,就直接调用conten的方法

所以,指令重排有好处也有坏处,一般可能是cpu、编译器或者是内存会进行指令重排,为了避免指令重排,保证并发编程的有序性,有时候需要使用synchronized或者volatile等等方式避免。volatile可以避免指令重排,保证并发编程的有序性,依赖于操作系统的内存屏障

4、volatile有什么作用?

从前面的学习也可以指定,volatile关键字是可以保证并发编程的有序性和可见性的

  • 保证可见性

volatile保证可见性:

  1. 使用volatile变量时,必须重新从主内存加载到工作内存
  2. 修改volatile变量后,必须马上同步回主内存

可见性涉及到Java内存模型,详细可以参考我上篇博客:链接

java内存模型(JMM)结构图,每个Java线程都有自己的工作内存,volatile修饰的变量,修改后,会自动同步到主内存;每个线程读取时都会从主内存先读取到工作内存的副本

注意:volatile只能保证变量的可见性,对于一个Java对象是不能保证的,要去对象具体的属性设置volatile

  • 保证有序性
    对于并发编程的有序性问题,前面已经做了比较详细的描述,主要是cpu、jvm、内存都会对代码执行顺序进行指令重排序,加上volatile可以保证有序性,避免指令重排,依赖于操作系统的内存屏障

5、volatile可以保证原子性?

volatitle只能保证单个变量的原子性,不能保证一系列操作的原子操作的,所以volatile是线程不安全的,不具有原子性

6、volatile 和 synchronized对比

  • volatile不可以保证线程安全,synchronized可以保证线程安全
  • volatile是轻量的,而且是没有锁机制的,性能比synchronized好
  • volatile不具有原子性,synchronized可以保证原子性

并发编程系列之volatile关键字详解相关推荐

  1. Java并发编程:volatile关键字详解

    volatile关键字两大特性:线程可见性/禁止指令重排序 原理:由jvm实现的一条汇编质量lock 要知道为什么会能保证线程的可见性,先要了解jmm的原子操作 假设一个变量initFlag默认为fa ...

  2. libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

  3. 高并发编程学习(2)——线程通信详解

    前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...

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

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

  5. 【Java并发编程 】同步——volatile 关键字

    英 /ˈvɒlətaɪl/ 我了太噢(记不住单词怎么读) 一.volatile的介绍? volatile是一个轻量级的synchronized,一般作用与变量,在多处理器开发的过程中保证了内存的可见性 ...

  6. volatile 关键字详解

    volatile,可以当之无愧的被称为Java并发编程中"出现频率最高的关键字",常用于保持内存可见性和防止指令重排序. 保持内存可见性 内存可见性(Memory Visibili ...

  7. C/C++中volatile关键字详解

    1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.这是 BS 在 "The ...

  8. Java volatile关键字详解

    1.关于volatile volatile是Java语言中的关键字,用来修饰会被多线程访问的共享变量,是JVM提供的轻量级的同步机制,相比同步代码块或者重入锁有更好的性能.它主要有两重语义,一是保证多 ...

  9. C语言volatile关键字详解

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

最新文章

  1. matlab画三维图
  2. 在IIS上搭建WebSocket服务器(三)
  3. MySQL用中间件ProxySQL实现读写分离和主节点故障应用无感应
  4. Python合并两个有序列表
  5. 你了解HTTPS工作原理吗?
  6. VSCode配合eslint进行JavaScript质量检查
  7. elasticsearch7常见查询(term、match、bool、filter)
  8. 将Spring MVC RESTful Web服务迁移到Spring 4
  9. 反射-获取java私有内部类反射类型、私有字段
  10. SEO之Google--PageRank优化剖析(三)
  11. linux   find acm time
  12. PHP list() 函数
  13. Hosts Setup Utility – 在线更新 hosts
  14. PowerTip of the Day-Removing Empty Things
  15. 【数字信号调制】基于matlab GUI AM+DSB+SSB+ASK+FSK+PSK调制解调【含Matlab源码 058期】
  16. 置换元素和非置换元素
  17. DM368开发 -- 视频监控系统相关技术研究(转毕设)
  18. 笔试必备:48道SQL练习题(Oracle为主)
  19. 从容器中获取宿主机IP地址
  20. C++ 数据结构——BF算法

热门文章

  1. UI 自动化测试 —— selenium的简单介绍和使用
  2. python输入10个数、找出对称数_Python入门100道习题(7)——找对称数
  3. rpa算python开发吗_[第十三集]Python之于MT,RPA之于AMT
  4. 操作系统原理--学习笔记2
  5. Hexo个人免费博客(五) 使用自己的域名
  6. linux应用程序通常由哪些文件组成,Linux系统的帐号文件由哪些组成( )。
  7. 简易网闸-内网服务器安全获取外网数据
  8. 华为 FunsionInsight HD 平台的 配置 source-taildir sink-hdfs
  9. GitHub 热门:机器学习 100 天项目彻底火了!
  10. 微信小程序全局变量(globalData)和缓存(StorageSync)的区别和用法