Java内存模型
2019-09-23 09:11:48来源:博客园 阅读 ()
Java内存模型
1、基本概念- 程序:代码,是为了完成某一个任务,代码序列(静态的概念)
- 进程:程序在某些数据上的一次运行(动态的概念)
- 线程:一个进程可能包含一个或多个线程(占有资源的独立单元)
- 方法区:类信息,常量,static变量,JIT (利用反射加载类)
- 堆:实例对象
- VM stack:Java方法在运行时的内存模型
- native method stack:Java本地方法运行的内存模型,与VM stack基本一样
- 程序计数器:存储执行下一条指令的地址
- 方法区、堆是所有线程共享的,虚拟机栈、本地方法栈、程序计数器都是线程私有的
- 主内存:共享的信息
- 工作内存:私有信息,基本数据类型,直接分配到工作内存;引用数据类型:引用的地址存放在工作内存,引用的对象存放在堆中
- 工作方式:
- 线程修改私有数据:直接在工作空间修改
- 线程修改共享数据:把数据复制到工作空间中去,在工作空间中修改,修改完成以后,刷新内存中的数据
- CPU缓存的一致性问题:并发处理的不同步
- 解决方案
- 总线枷锁,降低CPU吞吐量
- 缓存上的一致性协议(MESI)
- 当CPU在CACHE中操作数据时,如果该数据是共享变量,数据在CACHE读到寄存器中,进行新修改,并更新内存数据
- CaCHE LINE置无效,其他的CPU就从内存中读数据
- 原子性:不可分割
- 可见性:线程只能操作自己工作空间内的数据
- 有序性:程序中的顺序不一定就是执行的顺序
- 编译重排序
- 指令重排序
- 重排目的:提高运行效率
- as-if-seria:单线程中重排后不影响执行的结果,多线程
- happens-before:
- 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原则
- 传递原则
原文链接:https://www.cnblogs.com/liufei-yes/p/11566050.html
如有疑问请与原作者联系
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
- 国外程序员整理的Java资源大全(全部是干货) 2020-06-12
- 2020年深圳中国平安各部门Java中级面试真题合集(附答案) 2020-06-11
- 2020年java就业前景 2020-06-11
- 04.Java基础语法 2020-06-11
- Java--反射(框架设计的灵魂)案例 2020-06-11
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash