zoukankan      html  css  js  c++  java
  • 并发编程-java内存模型

    1. 基本概念

      程序:静态,用于完成某些功能的代码。

      进程:动态,运行中的程序

      线程:进程中的实际运作单位,一个进程可以包含一个或多个线程。

    2. JVM内存区域

    • 堆:线程共享,存放实例对象 (OOM)
    • 虚拟机栈 :线程私有 ,Java方法在运行时的内存模型 (OOM),存放局部变量、引用类型数据的地址、操作数栈
    • 本地方法栈
    • 方法区 : 线程共享,存放类信息,常量,静态变量等
    • 程序计数器 : 线程私有, 存放下一条指令的地址

    3. java内存模型(java memory model, JMM,抽象的模型)

    作用: 规范内存空间和工作空间数据的交互

    主内存: 线程共享的信息

    工作内存:线程私有的信息。基本数据类型,直接分配到工作内存。引用的地址存放在工作内存,引用的对象存放在堆中。

    工作方式:

      线程修改私有数据,直接在工作空间改

      线程修改共享数据,把数据复制到工作空间中,在工作空间中修改,修改完成后,刷新到内存。

    4. 硬件内存架构

    CPU缓存一致性问题的解决方案:

    1. 总线加锁(粒度太大) : 降低CPU的吞吐量

    2. 缓存一致性协议(MESI)

      读操作:不做任何事情,把cache中的数据读到寄存器

      写操作:发出信号通知其他CPU将该变量的cache line置为无效。其他CPU要访问这个变量只能从内存中读取。

     5. java线程与硬件处理器

    6. 并发编程的三个特性

    原子性:不可分割  x=1

    可见性:线程只能操作自己工作空间中的数据

    有序性:程序中的顺序不一定就是执行的顺序(编译重排序、指令重排序,目的:提高效率

    JMM对三个特征的保证

    1. JMM与原子性
    1. X=10  写  原子性   如果是私有数据具有原子性,如果是共享数据没原子性(读写)  
    2. Y=x  没有原子性
      1. 把数据X读到工作空间(原子性)
      2. 把X的值写到Y(原子性)
    3. I++ 没有原子性
      1. 读i到工作空间
      2. +1;
      3. 刷新结果到内存
    4. Z=z+1 没有原子性
      1. 读z到工作空间
      2. +1;
      3. 刷新结果到内存

    多个原子性的操作合并到一起没有原子性

    保证方式:

    Synchronized

    JUC   Lock的lock

    JMM与可见性 : 线程只能操作自己工作空间中的数据

         Volatile

         Synchronized:加锁

         JUC   JUC   Lock的lock

    1. JMM与有序性 :程序中的顺序不一定就是执行的顺序 

      Volatile:

      Synchronized:

    Happens-before原则:

    1. 程序次序原则
    2. 锁定原则  :后一次加锁必须等前一次解锁
    3. Volatile原则:霸道原则
    4. 传递原则:A---B ---C    A--C
  • 相关阅读:
    Reverse Integer
    Same Tree
    BST(Binary Search Tree)
    Maximum Depth of Binary Tree
    Single Number
    Computer System Basic Concept(2)
    破解企业QQ对个人QQ登陆的限制(原创)
    鸟哥的Linux私房菜.基础学习篇(摘要)(持续更新)
    Linux系列书籍
    【总结】关于彩虹表学习阶段性总结
  • 原文地址:https://www.cnblogs.com/yintingting/p/11409370.html
Copyright © 2011-2022 走看看