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

作者:Android开发者社区
地址:https://www.jianshu.com/p/27a9003c33f4
声明:本文是 Android开发者社区 原创投稿,转发等请联系原作者授权。

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

如果你想设计出优良的Java并发程序,那么学习并且理解Java的内存模型是不可缺少的。Java的内存模型规定了如何访问和何时访问其他线程修改后的共享变量。
Java内存模型把虚拟机划分为线程栈和堆,如图所示:

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


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

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


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

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


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值