本篇内容介绍了“什么是线程内存模型”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
JVM定义了Java的虚拟内存模型,跟C/C++不一样的是,虚拟内存将物理内存划分了不同的区域,而C/C++是直接映射物理内存的。
笼统的来说,jvm一般将内存分为栈和堆,栈用来存储静态方法和静态变量,而堆用来存储对象和普通变量。
但是如果从线程的角度,内存模型会变成下图的样子
在这个模型中,变量是在主内存中的,线程各自有各自的工作内存,不会出现相互干扰。
工作内存通过跟主内存之间的操作,实现变量数据的交换共享。而线程工作内存是相互隔离的。这样各线程工作的时候不会对其他线程的工作数据产生影响
如上图所示,左边是一个简单的卖票程序,右边是程序加载的内存模型,当程序通过类加载器加载到方法区后,在栈中建立的main方法的线程,创建了Tiecket t 的变量后,会在堆中建立该对象的成员变量tickets和方法
当在main方法中创建窗口1和窗口1线程后,每个线程都会有独立的栈内存空间,而这些栈内存共享相同的变量tickets
两块内存有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 前,变量会被重新写入主内存
“什么是线程内存模型”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注亿速云网站,小编将为大家输出更多高质量的实用文章!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。