线程、java内存模型、重排序、Happens-Before、As-If-Serail

Java内存模型

1、线程与JVM

2、java内存区域与java内存模型的区别

3、硬件内存架构与java内存模型

4、java内存模型对并发特征的保证

1、基本概念:

程序:代码,完成某一件任务,代码序列(静态的概念)

进程:程序在某些数据上的一次运行(动态的概念)

线程:一个进程可能包含一个或多个线程(占有资源的独立单元)

2、JVM与线程

JVM什么时候启动?类被调用
JVM线程—》其他的线程(main)
线程在JVM中

3、JVM内存区域

JVM模型

方法区:类信息(由类加载器加载ClassLoader)、常量、static 、JIT (jit是指java的即时编译) (信息共享)

注:类的反射就是在方法区来完成的

Java堆区:实例对象(对象信息) GC (信息共享) (OOM:内存溢出)

注:方法区和堆区都可以信息共享

VM stack(栈):Java方法在运行的内存模型 (OOM:内存溢出)

注:不能实现数据共享

存储的内容包括:一个本地变量如果是原始类型,那么它会被完全存储到栈区。

一个本地变量也有可能是一个对象的引用,这种情况下,这个本地引用会被存储到栈中,但是对象本身仍然存储在堆区。



VMStack模型图
PC(程序计数器):java线程的私有数据,这个数据就是执行下一条指令的地址

Native method stack(本地方法栈): 与JVM的native

4 Java内存模型 Java memory model JMM(规范,抽象的模型)

JMM模型
1)主内存:共享的信息

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

3)工作方式

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

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

注:工作空间是指一块内存区域,专门供某个线程使用的一块内存

问题1:工作空间的大小划分规则?如何保证空间不被浪费

答案:JVM VMStack 总的大小是固定的,每个线程的工作空间的大小是根据栈帧的大小来动态提供。也就是说分配线程的工作空间时,根据线程中数据的多少来分配。如果所有的栈帧的大小超过VMStack的总空间时,就会内存溢出。

即虚拟机栈可以提前分配,线程的工作空间动态分配。

5、硬件内存架构与java内存模型

1)硬件架构

硬件内存架构图
a)CPU缓存的一致性问题:并发处理的不同步

b)解决方案:

i.总线加锁() 降低CPU的吞吐量

ii.缓存上的一致性协议(MESI)

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

CaCHE LINE置无效,其他的CPU就从内存中读数据

2)Java线程与硬件处理器

Java线程和硬件处理机

3)Java内存模型与硬件内存架构的关系

MESI

交叉:数据的不一致

在这里插入图片描述

4)Java内存模型的必要性

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

6、并发编程的三个重要特性

原子性:不可分割 x=1

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

有序性:程序中的顺序不一定就是执行的顺序

编译重排序

指令重排序

提高效率

  • as-if-seria:单线程中重排后不影响执行的结果,多线程。
  • happens-before

7、JMM对三个特征的保证

1)JMM与原子性

A)X=10 写 原子性 如果是私有数据具有原子性,如果是共享数据没原子性(读写)

**B)Y=x 没有原子性 **

a) 把数据X读到工作空间(原子性)

b) 把X的值写到Y(原子性)

C)I++ 没有原子性

a)读i到工作空间

b)+1;

c)刷新结果到内存

D)Z=z+1 没有原子性

a)读z到工作空间

b)+1;

c)刷新结果到内存

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

保证方式:

Synchronized

JUC Lock的lock

2)JMM与可见性

 Volatile:在JMM模型上实现MESI协议 <br/>
 Synchronized:加锁 <br/>
JUC   JUC   Lock的lock <br/>

3)JMM与有序性

Volatile: 
 Synchronized: 
Happens-before原则: 
    1)程序次序原则 
    2)锁定原则  :后一次加锁必须等前一次解锁 
    3)Volatile原则:霸道原则 
    4)传递原则:A---B ---C    A--C 

总结:

JVM内存区域和JMM的关系 <br/>
JMM和硬件的关系 <br/>
JMM和并发编程三个重要特征(有序性  as-if-seria   happens-before  ) <br/>

参考文献:

[1]https://blog.csdn.net/suifeng3051/article/details/52611310

[2]http://www.infoq.com/cn/articles/java-memory-model-1

[3]http://www.jianshu.com/p/d3fda02d4cae

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值