并发编程系列之volatile关键字详解
并发编程系列之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保证可见性:
- 使用volatile变量时,必须重新从主内存加载到工作内存
- 修改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关键字详解相关推荐
- Java并发编程:volatile关键字详解
volatile关键字两大特性:线程可见性/禁止指令重排序 原理:由jvm实现的一条汇编质量lock 要知道为什么会能保证线程的可见性,先要了解jmm的原子操作 假设一个变量initFlag默认为fa ...
- libevent c++高并发网络编程_高并发编程学习(2)——线程通信详解
前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...
- 高并发编程学习(2)——线程通信详解
前序文章 高并发编程学习(1)--并发基础 - https://www.wmyskxz.com/2019/11/26/gao-bing-fa-bian-cheng-xue-xi-1-bing-fa-j ...
- java中实现具有传递性吗_Java中volatile关键字详解,jvm内存模型,原子性、可见性、有序性...
一.Java内存模型 想要理解volatile为什么能确保可见性,就要先理解Java中的内存模型是什么样的. Java内存模型规定了所有的变量都存储在主内存中.每条线程中还有自己的工作内存,线程的工作 ...
- 【Java并发编程 】同步——volatile 关键字
英 /ˈvɒlətaɪl/ 我了太噢(记不住单词怎么读) 一.volatile的介绍? volatile是一个轻量级的synchronized,一般作用与变量,在多处理器开发的过程中保证了内存的可见性 ...
- volatile 关键字详解
volatile,可以当之无愧的被称为Java并发编程中"出现频率最高的关键字",常用于保持内存可见性和防止指令重排序. 保持内存可见性 内存可见性(Memory Visibili ...
- C/C++中volatile关键字详解
1. 为什么用volatile? C/C++ 中的 volatile 关键字和 const 对应,用来修饰变量,通常用于建立语言级别的 memory barrier.这是 BS 在 "The ...
- Java volatile关键字详解
1.关于volatile volatile是Java语言中的关键字,用来修饰会被多线程访问的共享变量,是JVM提供的轻量级的同步机制,相比同步代码块或者重入锁有更好的性能.它主要有两重语义,一是保证多 ...
- C语言volatile关键字详解
volatile提醒编译器它后面所定义的变量随时都有可能改变,因此编译后的程序每次需要存储或读取这个变量的时候,都会直接从变量地址中读取数据.如果没有volatile关键字,则编译器可能优化读取和存储 ...
最新文章
- matlab画三维图
- 在IIS上搭建WebSocket服务器(三)
- MySQL用中间件ProxySQL实现读写分离和主节点故障应用无感应
- Python合并两个有序列表
- 你了解HTTPS工作原理吗?
- VSCode配合eslint进行JavaScript质量检查
- elasticsearch7常见查询(term、match、bool、filter)
- 将Spring MVC RESTful Web服务迁移到Spring 4
- 反射-获取java私有内部类反射类型、私有字段
- SEO之Google--PageRank优化剖析(三)
- linux find acm time
- PHP list() 函数
- Hosts Setup Utility – 在线更新 hosts
- PowerTip of the Day-Removing Empty Things
- 【数字信号调制】基于matlab GUI AM+DSB+SSB+ASK+FSK+PSK调制解调【含Matlab源码 058期】
- 置换元素和非置换元素
- DM368开发 -- 视频监控系统相关技术研究(转毕设)
- 笔试必备:48道SQL练习题(Oracle为主)
- 从容器中获取宿主机IP地址
- C++ 数据结构——BF算法
热门文章
- UI 自动化测试 —— selenium的简单介绍和使用
- python输入10个数、找出对称数_Python入门100道习题(7)——找对称数
- rpa算python开发吗_[第十三集]Python之于MT,RPA之于AMT
- 操作系统原理--学习笔记2
- Hexo个人免费博客(五) 使用自己的域名
- linux应用程序通常由哪些文件组成,Linux系统的帐号文件由哪些组成( )。
- 简易网闸-内网服务器安全获取外网数据
- 华为 FunsionInsight HD 平台的 配置 source-taildir sink-hdfs
- GitHub 热门:机器学习 100 天项目彻底火了!
- 微信小程序全局变量(globalData)和缓存(StorageSync)的区别和用法