zoukankan      html  css  js  c++  java
  • 多线程 volatile

    参考:https://mp.weixin.qq.com/s/DZkGRTan2qSzJoDAx7QJag

    建议阅读:《深入理解Java虚拟机》相关章节

    多线程下的

    原子性

    可见性

    指令重排序

    无法保证(单线程 可以保证)

    static int mainMemoryVariable=0;

    线程1:

    mainMemoryVariable++;

    mainMemoryVariable--;

    线程2:

    mainMemoryVariable++;

    mainMemoryVariable--;

    1、可见性

    jvm内存模型下  每个线程都有自己的工作内存(类比 计算机高速缓存);

      ①工作内存彼此不可见;

      ②线程操作共享内存(类比 计算机主内存)中变量的过程:get change set(这个set 不是即时的 所以 线程A改了共享内存某变量的值 对其他线程不是即时可见的)

    2、原子性

    mainMemoryVariable++;

    编译成字节码 机器码  其实是多条指令

    3、指令重排序(机器码 汇编代码)

    mainMemoryVariable++;

    编译成字节码 机器码  其实是多条指令

    多条指令在执行时  顺序不一定是编译后的顺序

    volatile 怎么保证可见性、指令重排序(JDK 1.5中):

    怎么保证 指令有序-->内存屏障

    一个变量被volatile修饰后

    在每个volatile变量写操作、读操作的前后 加入内存屏障指令 ;

  • 相关阅读:
    CTF简介
    最先与最后
    记一次某校版facemash的搭建
    ipv6入门
    win10开启IPv6的两种方法
    安装 Go 1.11 在 Ubuntu 18.04 & 16.04 LTS
    python开发者的AsyncIO
    Python 异步--Await the Future
    Python元类
    alias 和 unalias 命令
  • 原文地址:https://www.cnblogs.com/light-train-union/p/12933532.html
Copyright © 2011-2022 走看看