• Java并发编程volatile


    一. volatite 简述
    Java 语言提供了一种稍弱的同步机制,即 volatile 变量.用来确保将变量的更新操作通知到其他线程,保证了新值能立即同步到主内存,以及每次使用前立即从主内存刷新. 当把变量声明为volatile类型后,编译器与运行时都会注意到这个变量是共享的.
    二. volatite 线程安全?
    volatile 变量对所有线程是立即可见的,对 volatile 变量所有的写操作都能立即反应到其他线程之中,换句话说: volatile 变量在各个线程中是一致的,所以基于 volatile 变量的运算似乎是线程安全的。这个观点是错误的!
    三. volatite 为什么是线程不安全的?

    public class VolatileTest{
        public static volatile int i;
        public static void increase(){
           i++;
        }
    }
    


    javap -c -l VolatileTest.class

    public class VolatileTest {
        public static volatile int i;
        public VolatileTest();
        Code:
        0: aload_0
        1: invokespecial #1 // Method java/lang/Object."":()V
        4: return
        LineNumberTable:
        line 1: 0
        public static void increase();
        Code:
        0: getstatic #2 // Field i:I, 把i的值取到了操作栈顶,volatile保证了i值此时是正确的.
        3: iconst_1
        4: iadd // increase,但其他线程此时可能已经把i值加大了好多
        5: putstatic #2 // Field i:I ,把这个已经out of date的i值同步回主内存中,i值被破坏了.
        8: return
        LineNumberTable:
        line 6: 0
        line 7: 8
    }
    


    从这个角度说 volatile 并不完全是线程安全的,虽然volatile 变量在读取和保存的时候是原子的,但是自增和自减操作由多个操作合成,它不是一个原子操作。

  • 相关阅读:
    intelliJ IDEA 全屏键盘手
    NoNodeAvailableException异常的解决
    Java HotSpot(TM) Client VM 与 server VM 的配置
    乐优商城问题1:新增品牌失败
    Linux安装nginx的环境要求
    NeoVIM安装使用
    ubuntu18.04 开机定时启动任务
    【Eclipse+PyDev】使用Python的IDE安装及配置详解
    ARM开发板挂载Ubuntu18.04主机的NFS共享文件夹
    Ubuntu18.04 解决umount: /mnt: device is busy
  • 原文地址:https://www.cnblogs.com/suxuan/p/4948745.html
Copyright © 2020-2023  润新知