Android线程篇(五):Java内存模型

终于等到你,前面的几篇文章可以说是稀松平常,讲到的都是一些基础,大多数人都会,但是这边文章以及后面文章将是你和别人拉开差距的时候,也是Java多线程中的重中之重。

如果你想设计出优良的Java并发程序,那么学习并且理解Java的内存模型是不可缺少的。Java的内存模型规定了如何访问和何时访问其他线程修改后的共享变量。

Java内存模型把虚拟机划分为线程栈和堆,如图所示:


image.png

每一个运行在Java虚拟机的线程都拥有自己的一个独立的栈(线程栈),这个栈里面包含了这个线程调用的方法当前执行点的信息。每个线程只能访问自己的线程栈,每个线程创建的本地变量对于其他线程都不可见,即使是俩个线程执行的是同一个函数,俩个线程仍然在自己的线程栈中创建本地变量,So,每个线程拥有每个本地变量的独有版本。

这么讲貌似有些难理解,举个例子:
张三(线程)和李小花(李小花属于张三的本地变量)结婚了,他俩做了羞羞的事情,然后生了几个孩子,他们有了一个家(家就相当于线程栈,里面保存了张三调用“生孩子”这个方法当前执行点的信息),但是别人不知道张三是否结婚并且有孩子(每个线程创建的本地变量对于其他线程都不可见)

所有原始类型的本地变量都存放在线程栈上,因此对其它线程不可见。一个线程可能向另一个线程传递一个原始类型的变量的拷贝,但是它不能共享这个原始类型变量自身。

堆上包含在Java程序中创建的所有对象

一个本地变量也可能是指向一个对象的一个引用。在这种情况下,引用(这个本地变量)存放在线程栈上,但是对象本身存放在堆上。

image.png

两个线程拥有一些列的本地变量。其中一个本地变量(Local Variable 2)执行堆上的一个共享对象(Object 3)。这两个线程分别拥有同一个对象的不同引用。这些引用都是本地变量,因此存放在各自线程的线程栈上。这两个不同的引用指向堆上同一个对象。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • JVM内存模型Java虚拟机(Java Virtual Machine=JVM)的内存空间分为五个部分,分别是: ...
    光剑书架上的书阅读 2,641评论 2 26
  • 从三月份找实习到现在,面了一些公司,挂了不少,但最终还是拿到小米、百度、阿里、京东、新浪、CVTE、乐视家的研发岗...
    时芥蓝阅读 42,385评论 11 349
  • 第一步,了解JVM基本概念,基本结构。 第二步,了解JVM中线程私有区和公有区。 第三步,了解线程与Java内存模...
    Arya鑫阅读 1,231评论 0 10
  • 2018年1月22日 星期一 晴 昨天晚上下了今年第一场雪,我去阳台看了一下,发现地上积了很厚的...
    陈泉妡阅读 244评论 0 0
  • 2017年7月下旬,天使助残团队为期每个礼拜一周的友好走访日记,在经历了艰苦而充满阳光的一周,天使助残团...
    C11阅读 252评论 0 0