volatile关键字

举报
波波烤鸭 发表于 2022/03/30 01:26:42 2022/03/30
1.2k+ 0 0
【摘要】   volatile关键字是我们经常在面试过程中碰到的一个问题,本文来介绍下这个关键字 原则性,可见性,有序性   在具体介绍volatile之前我们先来看下这三个概念 原子性   原子性通常指多...

  volatile关键字是我们经常在面试过程中碰到的一个问题,本文来介绍下这个关键字

原则性,可见性,有序性

  在具体介绍volatile之前我们先来看下这三个概念

原子性

  原子性通常指多个操作不存在只执行一部分的情况,如果全部执行完成那没毛病,如果只执行了一部分,那对不起,你得撤销(即事务中的回滚)已经执行的部分。

可见性

  当多个线程访问同一个变量a时,线程1修改了变量a的值,线程1、线程2…线程n能够立即读取到线程1修改后的值.

有序性

  即程序执行时按照代码书写的先后顺序执行。在Java内存模型中,允许编译器和处理器对指令进行重排序,但是重排序过程不会影响到单线程程序的执行,却会影响到多线程并发执行的正确性。

volatile关键字

  关键字volatile是java虚拟机提供的最轻量级的同步机制。单词翻译过来是“不稳定,反复无常”.描述的也很形象,说明被声明为volatile的变量很容易被改变。当一个变量被声明为了volatile类型后它就具备了两种特性:

  1. 保证此变量对所有线程的可见性,这里的可见性指的是当一条线程修改了这个变量的值,新值对于其他线程来说是可以立即得知的,而普通变量做不到这点。
  2. 禁止指令重排序优化。普通变量仅仅会保证在该方法的执行过程中所有依赖赋值结果的地方都能获取到正确的结果,而不能保证变量赋值操作的顺序和程序代码的执行顺序一致,而volatile变量能保证变量前后的执行顺序。

接下来看下Java内存模式对Volatile制定的特殊的规则,假设T表示一个线程,V和W分别表示两个volatile型变量,那么在进行read,load,use,assign,store和write操作时需要满足如下规则:

  1. 只有当线程T对变量V执行的前一个动作是load的时候,线程T才能对变量V执行use动作,并且,只有当线程T对变量V执行的后一个动作是use的时候,线程T才能对变量V执行load动作,线程T对变量V的use动作可以认为是和线程T对变量V的load、read动作相关联,必须连续一起出现(这条规则要求在工作内存中,每次使用V前都必须先从主内存中刷新最新的值,用于保证能看见其他线程对变量V所修改后的值)。
  2. 只有当线程T对变量V执行的前一个动作是assign的时候,线程T才能对变量V执行store动作,并且,只有当线程T对变量V执行的后一个动作是store的时候,线程T才能对变量V执行assign动作,线程T对变量V的assign动作可以认为是和线程T对变量V的store、write动作相关联,必须连续一起出现,(这条规则要求在工作内存中每次修改V后都必须立刻同步回主内存中,用于保证其他线程可以看到自己对变量V的修改)
  3. 假定动作A是线程T对变量V实施的use或者assign动作,假定动作F是和动作A相关联的load或者store动作,假定动作P是和动作F相应的对变量V的read或者write动作,类似的,假定B是线程T对变量W实施的use或者assign动作,假定动作G是和动作B相关联的load或者store动,假定动作Q是和动作G相应的对变量W的read或write动作,如果A先于B,那么P先于Q,(这条规则要求volatile修饰的变量不会被指令重排序优化,保证代码的执行顺序与程序顺序相同)

参考《深入理解Java虚拟机》

文章来源: dpb-bobokaoya-sm.blog.csdn.net,作者:波波烤鸭,版权归原作者所有,如需转载,请联系作者。

原文链接:dpb-bobokaoya-sm.blog.csdn.net/article/details/88409473

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

作者其他文章

评论(0

抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。