`
xgbjmxn
  • 浏览: 262943 次
  • 性别: Icon_minigender_1
  • 来自: 新乡
社区版块
存档分类
最新评论

浅谈Volatile

阅读更多
javavolatile
我们用一段简单的代码来开头
Java代码  收藏代码

    public int i = 0; 
    public void increase(){  
        i++; 
    } 
    //getter 


    以上这段代码在多线程高并发的状态下能否保证所取得的i是所期待的值,答案肯定是不能的,因为对JAVA来说数据的操作是非原子性的。还有的就是部份人认为给变量i加上volatile关键字就能保证了数据操作的原子性,这显然是错误的。要记住volatile关键字只保证其可见性,也就是说当某线程修改了i的值,修改后的值对其它线程来说是立即可见的。下面我们分析通过increase()方法的字节码来解释。
Java代码  收藏代码

    public void increase(); 
    public void increase(); 
       flags: ACC_PUBLIC 
       Code: 
        stack=3, locals=1, args_size=1 
           0: aload_0 
           1: dup 
           2: getfield      #2                  // Field i:I 
           5: iconst_1 
           6: iadd 
           7: putfield      #2                  // Field i:I 
          10: return 
        LineNumberTable: 
          line 5: 0 
          line 6: 10 


    编号2到7这几行指令就是i++;的,首先getfield获取到了i的值并把它压入栈顶,在这里如果i变量有加volatile关键字,则能保证i的正确性,因为无论之前有几个线程对i作了修改,它总是能够第一时间得知。如果是普通变量的话,比如A线程对变量i修改完新值后要把它重写回主内存中,其它线程要想得知i的新值要在A线程重写回主内存之后,对这感兴趣的可以看下主线程和工作线程相关的内容。 接下来就是引发问题的关键之处了,假如当A线程准备执行相加指令时,其它线程已经把i值修改了,而A线程的操作数栈顶的值已经变为脏数据了,在执行putfield后把不正确的数据同步回主内存里。
分享到:
评论

相关推荐

    Volatile详解,深入学习Volatile

    详细说明 并举例说明了VOlatile的作用及用法,特别是嵌入式程序员要注意的

    java volatile 关键字实战

    java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java volatile 关键字实战java ...

    C语言中关键字volatile的作用

    C语言中关键字volatile的作用,使用说明和例子

    从汇编角度理解volatile

    一般对于volatile的解释是这样的:将变量定义为volatile可以防止编译器对变量进行优化,每次均从内存中访问变量,而不是寄存器。既然让编译器优化可以提高访问速度,那为什么又要不用它以及什么时候不用它?其实主要...

    const和volatile分析

    const和volatile分析 这个分析得很好 面试 找工作 必备的

    浅谈C++中的mutable和volatile关键字

    下面小编就为大家带来一篇浅谈C++中的mutable和volatile关键字。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    volatile的用法讲解

    volatile的用法讲解,讲得很详细,希望能帮助到大家

    volatile的使用

    一般说来,volatile用在如下的几个地方: 1、中断服务程序中修改的供其它程序检测的变量需要加volatile; 2、多任务环境下各任务间共享的标志应该加volatile; 3、存储器映射的硬件寄存器通常也要加volatile说明,...

    Java线程:volatile关键字

    主要讲述java线程volatile关键字

    volatile变量详解

    容易忽略的变量声明,但是很重要 volatile的作用: 作为指令关键字,确保本条指令不会因编译器的优化而省略,且要求每次直接读值.

    C++ volatile 详解

    C++ volatile 详解 C++ 中的 volatile 关键字是用于修饰变量的,通常用于建立语言级别的 memory barrier。它是一种类型修饰符,用来声明可以被某些编译器未知的因素更改的类型变量,例如操作系统、硬件或者其它线程...

    volatile的用法

    volatile的用法,在写代码正确使用volatile,正确理解volatile的用法,增强代码的健壮性

    volatile的使用方法

    C程序中volatile关键字的使用.方法及其例程介绍。

    extern_volatile等修饰符的用法

    "extern_volatile等修饰符的用法" 在C++语言中,extern、volatile、const、static等修饰符都是非常重要的,它们可以影响变量的存储方式、生命周期和访问权限等。本文将详细介绍这些修饰符的用法和特点。 一、const...

    volatile用法

    c语言下关键字的volatile用法,包含一些基本例子

    volatile与synchronized的区别

    volatile与synchronized的区别,锁提供了两种主要特性:互斥(mutual exclusion) 和可见性(visibility)

    volatile_unsigned_int

    讲述了volatile_unsigned_int地址映射的使用说明。

    volatile源码分析1

    前言Java中volatile这个热门的关键字,在面试中经常会被提及,在各种技术交流群中也经常被讨论,但似乎讨论不出一个完美的结果,带着种种疑惑,准备从JVM、

    单片机C语言中volatile的作用

    本文给大家介绍了单片机C语言中volatile的作用。

    const,extern,static,volatile的使用

    const,extern,static,volatile的使用

Global site tag (gtag.js) - Google Analytics