线程内存模型
2019-10-10 12:05
1076 查看
1.内存模型图的思维转换
JVM定义了Java的虚拟内存模型,跟C/C++不一样的是,虚拟内存将物理内存划分了不同的区域,而C/C++是直接映射物理内存的。
笼统的来说,jvm一般将内存分为栈和堆,栈用来存储静态方法和静态变量,而堆用来存储对象和普通变量。
但是如果从线程的角度,内存模型会变成下图的样子
在这个模型中,变量是在主内存中的,线程各自有各自的工作内存,不会出现相互干扰。
工作内存通过跟主内存之间的操作,实现变量数据的交换共享。而线程工作内存是相互隔离的。这样各线程工作的时候不会对其他线程的工作数据产生影响
2.实例解析线程内存模型
如上图所示,左边是一个简单的卖票程序,右边是程序加载的内存模型,当程序通过类加载器加载到方法区后,在栈中建立的main方法的线程,创建了Tiecket t 的变量后,会在堆中建立该对象的成员变量tickets和方法
当在main方法中创建窗口1和窗口1线程后,每个线程都会有独立的栈内存空间,而这些栈内存共享相同的变量tickets
3.工作内存和主内存之间的操作(单个线程)
两块内存有8种操作。
- (lock - unlock) lock将一个主内存变量标记成线程独占,unlock将独占的变量释放
- (read - load)read 将主内存的变量读取到CPU中,load操作将read到的变量存入到工作内存中,一定会成对出现
- (use - assign) use将工作内存中的变量传递给执行的代码中,当代码需要使用变量值的字节码时,需要这个操作。 assign 赋值操作,将代码中赋值指令出现时,把收到的变量赋值到工作内存中
- (store - write) store 将工作内存的变量传送回主内存,但是只是传送,write操作才会将值写入到主内存。而且这两个一定会成对出现
- read load ; store write只能成对操作,不能出现只读不用,只返回不存储
- 不允许线程丢弃assign操作,用完的变量一定会传回主内存,也不允许将未assign的变量从工作内存写回主内存
- 变量只能从主内存中创建,未初始化的变量线程不能load 或 assign
- 变量只能被一条线程lock,而且可以lock很多次,必须执行相应条数的unlock才会被释放
- 线程只能unlock自己lock的变量,未被lock的变量不能执行unlock,不允许unlock其他线程lock的变量
- lock变量操作会将工作内存的变量清空,使用这个变量时,相应使用这个变量时,需要重新load 和assign
- unlock 前,变量会被重新写入主内存
相关文章推荐
- java线程内存模型,线程、工作内存、主内存
- java线程内存模型,线程、工作内存、主内存
- Java 线程通信内存模型---主内存与工作内存
- java的线程内存模型
- 读 - 深入理解java虚拟机 - 笔记(二) - java内存模型与线程(12章)-处理器的内存模型
- Java 线程/内存模型的缺陷和增强-Java基础-Java-编程开发
- java线程内存模型,线程、工作内存、主内存
- Java 线程/内存模型的缺陷和增强
- java线程内存模型,线程、工作内存、主内存
- 死磕Java多线程(三)--- Java线程的内存模型
- Java 内存模型与线程
- Java---线程多(工作内存)和内存模型(主内存)分析
- 一,谈谈JAVA线程的运行内存模型【JAVA内存模型】
- Java 线程/内存模型的缺陷和增强
- Java内存模型学习之内存模型结构 线程通信 内存可见,指令重排(付代码实例说明,强烈推荐看看,面试必加分)
- jvm 内存模型与线程 & Volatile
- actor并发模型&基于共享内存线程模型
- jvm.内存模型与线程
- 并发模型之——共享内存模型(线程与锁)理论篇
- java线程内存模型,线程、工作内存、主内存