zoukankan      html  css  js  c++  java
  • Java线程工作内存与主内存变量交换过程及volatile关键字理解

    Java线程工作内存与主内存变量交换过程及volatile关键字理解

    1. Java内存模型规定在多线程情况下,线程操作主内存变量,需要通过线程独有的工作内存拷贝主内存变量副本来进行。此处的所谓内存模型要区别于通常所说的虚拟机堆模型:

    2. 线程独有的工作内存和进程内存(主内存)之间通过8中原子操作来实现,如下图所示:

    原子操作的规则(部分):

    1) read,load必须连续执行,但是不保证原子性。

    2) store,write必须连续执行,但是不保证原子性。

    3) 不能丢失变量最后一次assign操作的副本,即遍历最后一次assign的副本必须要回写到MainMemory中。

    其它规则详见《深入理解Java虚拟机》第12章 Java内存模型与线程

    3. volatile关键字

    定义为volatile类型的变量拥有两种语义:

    1) 变量的修改对所有线程可见

    理解:

      线程中每次use变量时,都需要连续执行read->load->use几项操作,即所谓的每次使用都要从主内存更新变量值,这样其它线程的修改对该线程就是可见的。

      线程每次assign变量时,都需要连续执行assign->store->write几项操作,即所谓每次更新完后都会回写到主内存,这样使得其它线程读到的都是最新数据。

    2)禁止指令重排

     

    参考:

    《深入理解Java虚拟机》第12章 Java内存模型与线程

  • 相关阅读:
    机器码call和jmp地址的计算
    linux下系统对于sigsegv错误时的处理
    elf文件中的.plt .rel.dyn .rel.plt .got .got.plt的关系
    docker随谈
    nginx性能优化技巧
    ubuntu安装php常见错误集锦
    ubuntu php5.6源码安装
    关于mysqld_safe
    ubuntu mysql5.7源码安装
    linux下nginx模块开发入门
  • 原文地址:https://www.cnblogs.com/wrencai/p/5704331.html
Copyright © 2011-2022 走看看