Android线程篇(五):Java内存模型
作者:Android开发者社区
地址:https://www.jianshu.com/p/27a9003c33f4
声明:本文是 Android开发者社区 原创投稿,转发等请联系原作者授权。
终于等到你,前面的几篇文章可以说是稀松平常,讲到的都是一些基础,大多数人都会,但是这边文章以及后面文章将是你和别人拉开差距的时候,也是Java多线程中的重中之重。
如果你想设计出优良的Java并发程序,那么学习并且理解Java的内存模型是不可缺少的。Java的内存模型规定了如何访问和何时访问其他线程修改后的共享变量。
Java内存模型把虚拟机划分为线程栈和堆,如图所示:
每一个运行在Java虚拟机的线程都拥有自己的一个独立的栈(线程栈),这个栈里面包含了这个线程调用的方法当前执行点的信息。每个线程只能访问自己的线程栈,每个线程创建的本地变量对于其他线程都不可见,即使是俩个线程执行的是同一个函数,俩个线程仍然在自己的线程栈中创建本地变量,So,每个线程拥有每个本地变量的独有版本。
这么讲貌似有些难理解,举个例子:
张三(线程)和李小花(李小花属于张三的本地变量)结婚了,他俩做了羞羞的事情,然后生了几个孩子,他们有了一个家(家就相当于线程栈,里面保存了张三调用“生孩子”这个方法当前执行点的信息),但是别人不知道张三是否结婚并且有孩子(每个线程创建的本地变量对于其他线程都不可见)
所有原始类型的本地变量都存放在线程栈上,因此对其它线程不可见。一个线程可能向另一个线程传递一个原始类型的变量的拷贝,但是它不能共享这个原始类型变量自身。
堆上包含在Java程序中创建的所有对象
一个本地变量也可能是指向一个对象的一个引用。在这种情况下,引用(这个本地变量)存放在线程栈上,但是对象本身存放在堆上。
两个线程拥有一些列的本地变量。其中一个本地变量(Local Variable 2)执行堆上的一个共享对象(Object 3)。这两个线程分别拥有同一个对象的不同引用。这些引用都是本地变量,因此存放在各自线程的线程栈上。这两个不同的引用指向堆上同一个对象。