并发编程-java内存模型

1. 基本概念

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

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

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

2. JVM内存区域

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

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

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

主内存: 线程共享的信息

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

工作方式:

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

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

4. 硬件内存架构

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

1. 总线加锁 : 降低CPU的吞吐量

2. 缓存上的一致性协议

当CPU在CACHE中操作数据时,如果该数据是共享变量,数据在CACHE读到寄存器中,进行新修改,并更新内存数据

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

猜你喜欢

转载自www.cnblogs.com/yintingting/p/11409370.html