Java内存模型

1、基本概念
  • 程序:代码,是为了完成某一个任务,代码序列(静态的概念)
  • 进程:程序在某些数据上的一次运行(动态的概念)
  • 线程:一个进程可能包含一个或多个线程(占有资源的独立单元)
 
2、JVM与线程
    JVM什么时候启动? 
    类被调用是时启动JVM,JVM线程 启动 其他线程(mian...)
 
3、JVM内存模型
  • 方法区:类信息,常量,static变量,JIT (利用反射加载类) 
  • 堆:实例对象       
  • VM stack:Java方法在运行时的内存模型
  • native method stack:Java本地方法运行的内存模型,与VM stack基本一样  
  • 程序计数器:存储执行下一条指令的地址
  • 方法区、堆是所有线程共享的,虚拟机栈、本地方法栈、程序计数器都是线程私有的 
 
 
VM stack图解:
 
 
4、Java内存模型 JMM(Java Memory Model)(这是一个规范,抽象的模型)
 
  • 主内存:共享的信息
  • 工作内存:私有信息,基本数据类型,直接分配到工作内存;引用数据类型:引用的地址存放在工作内存,引用的对象存放在堆中
  • 工作方式:
    • 线程修改私有数据:直接在工作空间修改
    • 线程修改共享数据:把数据复制到工作空间中去,在工作空间中修改,修改完成以后,刷新内存中的数据
 
5、硬件内存架构与JMM
        1. 硬件架构
    
  • CPU缓存的一致性问题:并发处理的不同步
  • 解决方案
    • 总线枷锁,降低CPU吞吐量
    • 缓存上的一致性协议(MESI)
      • 当CPU在CACHE中操作数据时,如果该数据是共享变量,数据在CACHE读到寄存器中,进行新修改,并更新内存数据
      • CaCHE  LINE置无效,其他的CPU就从内存中读数据
 
6、Java内存模型的必要性
Java内存模型的作用:规范内存数据和工作空间数据的交互
 
7、并发编程的三个重要特性
  • 原子性:不可分割
  • 可见性:线程只能操作自己工作空间内的数据
  • 有序性:程序中的顺序不一定就是执行的顺序
    • 编译重排序
    • 指令重排序
    • 重排目的:提高运行效率  
    • as-if-seria:单线程中重排后不影响执行的结果,多线程
    • happens-before:
 
8、JMM对三个特征的保证
  • JMM与原子性
    • X=10  写   原子性   如果是私有数据具有原子性,如果是共享数据没原子性
    • Y=X    没有原子性
      • 把数据X读到工作空间(原子性)
      • 把X的值写到Y(原子性)
    • i++     没有原子性
      • 读取i的值到工作空间
      • i+1
      • 刷新结果到内存
    • z=z+1    没有原子性
    • 结论:多个原子性的操作合并到一个没有原子性
    • 解决方法:synchronized、JUC Lock的lock
  • JMM与可见性
    • volatile:在JMM模型上实现MESI的协议
    • synchronized:加锁
    • JUC:Lock的lock
  • JMM与有序性
    • volatile
    • synchronized
    • happens-before原则
      • 程序次序原则
      • 锁定原则:后一次加锁必须要等前一次解锁
      • volatile原则
      • 传递原则
 
下次为大家详解synchronized、volatile等原则

转载于:https://www.cnblogs.com/liufei-yes/p/11566050.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值