• 技术文章 >java >java基础

    java volatile的特性是什么

    小妮浅浅小妮浅浅2021-01-09 09:32:53原创2637

    在对java变量进行修饰时,有一种修饰符专门负责这类操作,也不用担心它的用法出错,那就是volatile。和synchronized最明显的区别是只针对变量,其他的类型不修饰。相信大家对它的使用还不是很了解,下面我们就volatile的概念及其三个特性带来分析,弄清楚这些特性的原理。

    1.volatile概念

    volatile通常被比喻成"轻量级的synchronized",也是Java并发编程中比较重要的一个关键字。和synchronized不同,volatile是一个变量修饰符,只能用来修饰变量。无法修饰方法及代码块等。

    2.volatile三个特性

    (1)保证可见性

    当一个变量被声明为volatile时,在编译成会变指令的时候,会多出下面一行:

    0x00bbacde: lock add1 $0x0,(%esp);

    这句指令的意思就是在寄存器执行一个加0的空操作。不过这条指令的前面有一个lock(锁)前缀。

    (2)不保证原子性

    volatile 变量的 i++,分三步:

    读取 i 变量的值,如果之前有其它线程写入,则当前线程工作内存中的变量值会失效,要从主存重新读取;

    在工作内存中执行 i+1;

    i 的新值立刻写入主存,并使其它线程工作内存中的 i 变量失效。

    volatile 保证变量 i 的写入为原子性,实际上前两步也是原子性,但多个原子性操作组合在一起就不是原子性了。所以 volatile 变量的 i++ 操作仍然是非原子性操作。

    (3)保证有序性

    例如:

    a = 1;
    b = 1;
    x = 1;
    c = 1;
    d = 1;

    如果 x 是 volatile 变量,其它都不是,那么:

    a,b 的操作可以被重排序,即 a 有可能在 b 后面,但 a,b 一定不会重排序到 x 的后面;

    c,d 的操作可以被重排序,即 c 有可能在 d 后面,但 c,d 一定不会重排序到 x 的前面。

    以上就是java volatile的特性介绍,相信经过本篇的分析和代码示例,大家已经能够弄清楚 volatile这个变量修饰符的基本特征了,在以后的使用时才不容易出错。

    专题推荐:java volatile特性
    上一篇:同步在java线程的理解 下一篇:synchronized在java中的修饰

    相关文章推荐

    • java main的使用• 同步在java线程的理解

    全部评论我要评论

    © 2021 Python学习网 苏ICP备2021003149号-1

  • 取消发布评论
  • 

    Python学习网