• 68046

    文章

  • 643

    评论

  • 65

    友链

  • 最近新加了换肤功能,大家多来逛逛吧~~~~
  • 喜欢这个网站的朋友可以加一下QQ群,我们一起交流技术。

线程内存模型

撸了今年阿里、腾讯和美团的面试,我有一个重要发现.......>>

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 前,变量会被重新写入主内存

 转载至链接:https://my.oschina.net/u/4201801/blog/3115069。

695856371Web网页设计师②群 | 喜欢本站的朋友可以收藏本站,或者加入我们大家一起来交流技术!

欢迎来到梁钟霖个人博客网站。本个人博客网站提供最新的站长新闻,各种互联网资讯。 还提供个人博客模板,最新最全的java教程,java面试题。在此我将尽我最大所能将此个人博客网站做的最好! 谢谢大家,愿大家一起进步!

转载原创文章请注明出处,转载至: 梁钟霖个人博客www.liangzl.com

0条评论

Loading...


发表评论

电子邮件地址不会被公开。 必填项已用*标注

自定义皮肤
注册梁钟霖个人博客