ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

volatile解释

2021-04-03 20:58:47  阅读:218  来源: 互联网

标签:解释 变量 volatitle 线程 内存 有序性 volatile


前言

并发编程中的三大特性:

  1. 原子性:一个或者多个操作,要么全部执行,要不全都不执行;而且执行中途不能被中断,如果被中断,则要进行回滚。
  2. 可见性:多个线程共同访问共享变量时,如果此时有某个线程修改了此变量,其他线程中的该变量的缓存会立刻失效,并且重新从内存中缓存修改后的值。
  3. 有序性:程序执行代码的顺序,共享内存模型(JMM)允许编译器和处理器提高执行效率,对代码执行的顺序进行调整和优化,在单线程的情况下,指令重排不会影响执行的结果,但是多线程的情况下,可能会出现不一样的结果。

synchronize 关键字同时保证了以上三种特性。

volatitle

volatitle只保证了可见性和有序性,但是无法保证原子性,所以利用 volatitle 实现同步比 synchronized 执行所需要的消耗要小,volatitle 不会引起上下文的切换和调度。

volatitle 可见性

共享内存模型(JMM)中规定,所有的变量都是储存在主内存中,每个线程都有自己的工作内存,每个线程的工作内存中的变量都是主内存变量的副本。线程对变量的读和写都只能在各自的工作内存中进行,不能直接读、写主内存中的变量,并且每个线程的工作内存是线程私有。

对于普通共享变量,线程A修改了变量之后,主内存中的值什么时候被更新无法得知,此时线程B读取了自己工作内存中的该变量,则读取到的是一个修改前的值,出现了线程不安全问题。

如果该变量被volatitle修饰,则会引起一系列不同的变化:

  1. 如果某个线程修改了被volatitle修饰的变量,则操作系统会强制将线程工作内存中的修改后的变量立即写回主内存中;
  2. 并且会使其他线程的工作内存中该变量的副本会失效,如果其他线程想要再使用该变量,只能先从主内存中得到最新的该变量的副本拷贝到线程私有的工作内存再使用。

volatitle 有序性

volatitle 是通过在javac编译java文件生成class字节码文件的时候,在指令序列中添加“内存屏障”来禁止指令重排序 。

字节码文件中,被volatitle修饰的变量会加入标志ACC_VOLATILE。

JVM的实现会在volatile读写前后均加上内存屏障,在一定程度上保证有序性。如下所示:

LoadLoadBarrier
volatile 读操作
LoadStoreBarrier

StoreStoreBarrier
volatile 写操作
StoreLoadBarrier

标签:解释,变量,volatitle,线程,内存,有序性,volatile
来源: https://blog.csdn.net/weixin_44355752/article/details/115420002

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有