并发编程-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
原文地址:https://www.cnblogs.com/yintingting/p/11409370.html