您的位置:首页 > 编程语言 > Java开发

线程内存模型

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种操作。

  1. (lock - unlock) lock将一个主内存变量标记成线程独占,unlock将独占的变量释放
  2. (read - load)read 将主内存的变量读取到CPU中,load操作将read到的变量存入到工作内存中,一定会成对出现
  3. (use - assign) use将工作内存中的变量传递给执行的代码中,当代码需要使用变量值的字节码时,需要这个操作。 assign 赋值操作,将代码中赋值指令出现时,把收到的变量赋值到工作内存中
  4. (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