demo 地址 https://github.com/994955138/ConditionVariableDemo.git

我们先给结论,再用实例验证。

结论:进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。
线程是程序执行时的最小单位,它是进程的一个执行流,是CPU调度和分派的基本单位。

1.线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据。不过如何处理好同步与互斥是编写多线程程序的难点。

2.进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,所以不共享全局变量、静态变量等数据,但这种操作非常昂贵。进程之间的通信需要以通信的方式(IPC)进行。

3.但是多进程程序更健壮,多线程程序只要有一个线程死掉,整个进程也死掉了,而一个进程死掉并不会对另外一个进程造成影响,因为进程有自己独立的地址空间。

首先我们来验证一下多线程之间的全局变量是否是共享的?

for(int threadnum =0; threadnum<5;threadnum++){createNewThread(threadnum);
}
private void createNewThread(int threadNum){new Thread(){@Overridepublic void run() {super.run();for(int count = 0; count<50; count++){Log.e("MainAcivity","threadNum = " + threadNum+"  mIndex = " + (++Constan.mIndex));}}}.start();}
}

可以看到 mindex的值是累积的,所以多线程的全局变量确实是共享的。至于顺序为什么不是按照递增的,这是由于拼接和打印字符串需要时间,同时其他线程还在操作mindex值,但是mindex值是唯一的,没有重复值。这说明mindex是共享的。

我们加个同步锁看看

可以看出 synchronized 确实可以使代码块在多线程的情况下,同一时间只有一个线程在操作,可见synchronized是一种独占锁(只能有一个线程拿到锁)和悲观锁(先加锁再执行)。至于为什么0线程执行完后是4线程接着执行,而不是1线程接着执行。这大概和JMM的指令重排序有关系,感兴趣的同学可以去研究一下。

我们来看看跨进程的情况,

看日志

可以看出,跨进程的情况下mindex的值又从1开始计算,所以跨进程的全局变量是不共享的。他们存在于各自进程的内存中。

最后跨进程的代码就更健壮吗?我们来尝试一下多线程中有一个线程崩溃的情况

如上代码,如果多线程的情况下一个线程的崩溃不会影响其他线程的话,那么最终的结果应该是大概打印到80万。

看日志

明显没有打印到800000左右。所以一个线程的崩溃导致进程被回收,其他线程失去依赖,也会退出执行。我们来看看跨进程的情况,是否一个进程的崩溃不影响另外一个进程的执行。我们缩小数据规模更方便分析。



看日志

可以看出MainActivity的进程已经死亡,但是MainActivity2的进程依旧活着。并且完成了所有线程任务。

demo 地址 https://github.com/994955138/ConditionVariableDemo.git

实例说明 Android 多线程、多进程与全局变量之间的关系相关推荐

  1. 一篇文章看明白 Android 图形系统 Surface 与 SurfaceFlinger 之间的关系

    Android - SurfaceFlinger 图形系统 相关系列 一篇文章看明白 Android 系统启动时都干了什么 一篇文章了解相见恨晚的 Android Binder 进程间通讯机制 一篇文 ...

  2. android中matrix的单位,Android中canvas和matrix之间的关系是什么?

    我读了这个画布概述: The Canvas class holds the "draw" calls. To draw something, you need 4 basic co ...

  3. 【Android 界面效果10】Android中View,ViewGroup,Window之间的关系

    一.首先说说View和ViewGroup吧 Android系统中的所有UI类都是建立在View和ViewGroup这两个类的基础上的.所有View的子类成为"Widget",所有V ...

  4. Android px density densityDpi dp 之间的关系和区别

    px 表示屏幕的物理像素,例如 1080×1920 densityDpi 简称dpi,我们常说的像素密度,表示1英寸上对应有多少个像素,例如 160dpi.320dpi.440dpi.480dpi. ...

  5. Android中的APK,TASK,PROCESS,USERID之间的关系

    开发Android已经有一段时间了,今天接触到底层的东西,所以对于进程,用户的id以及Android中的Task,Apk之间的关系,要做一个研究,下面就是研究结果: apk一般占一个dalvik,一个 ...

  6. python类与类的关系_python 类与类之间的关系

    一.依赖关系(紧密程度最低) (1)简单的定义:就是方法中传递一个对象.此时类与类之间存在依赖关系,此关系比较低. (2)实例植物大战僵尸简易版 题目要求:创建一个植物,创建一个僵尸 1.植物:名字. ...

  7. android多线程讲解与实例

    本期的多线程主题与Android相关,侧重讲解在Android中如何用好多线程,需要你有Java的多线程基础. 首先我们思考几个问题,在Android应用中为什么要用多线程?为了解决哪些问题?或者为了 ...

  8. Android开发实例——倒计时器——Android多线程编程

    文章目录 一.倒计时器功能描述 二.实现步骤 1.新建Activity,命名为ThreadDemo 2.设计ThreadDemo 的布局文件 3.编写ThreadDemo.java 文件代码 3.1 ...

  9. 【Python】单线程异步多线程多进程实例

    上一篇文章主要介绍了多任务场景下单线程异步.多线程.多进程如何选择,链接:多任务场景下单线程异步多线程多进程 这里主要通过三个实例去验证一下简单的多任务场景下,三种方式的耗时情况,假设有10个互不关联 ...

最新文章

  1. 数据结构—顺序表的插入算法
  2. 计算机视觉工具包Luminoth
  3. hibernate教程--检索方式详解(hql,sql,QBC)
  4. matlab simulink笔记04——switch模块
  5. 数据结构与算法专题——第三题 最长公共子序列
  6. java假设模拟请求重新启动路由器(网络爬虫经常使用),还有java怎样下载图片
  7. Centos安装Clion
  8. git 总是要求输入密码的问题
  9. Exception in thread “main“ java.awt.AWTError: Assistive Technology not found: org.GNOME.Accessibilit
  10. 基于matlab人脸识别论文,基于matlab的人脸识别系统设计 毕业论文
  11. java运行内存不足_Java运行过程出现的内存不足问题
  12. 员工辞职的真正原因:更想远离这样的领导,而不是这家公司
  13. mupdf中CMYK与RGB的转换算法
  14. 44道JavaScript送命题
  15. 南京金融python培训班
  16. 【在线图表生成】掌握这些图表,年终报表根本不用愁!
  17. python 九九乘法口诀表好记方法_背诵九九乘法口诀表的好方法,赶快收藏,让孩子熟练记忆并掌握!...
  18. 15 个国外免费卫星图像数据源介绍
  19. 金融学具体包括什么专业,就业方向?
  20. 董军宇教授应邀在中国计算机应用大会智慧海洋分论坛做报告

热门文章

  1. wifi微信连不到服务器,家里的wifi微信一直说链接不上服务器咋回事?
  2. Python超复古小小小小小游戏项目(终)
  3. 自媒体账号被扣分限流了怎么办?继续更新还是注销?3招教你解决
  4. html js秒杀倒计时,JavaScript仿京东秒杀倒计时代码实例
  5. vue中的props
  6. 出现strings must use singlequote.报错
  7. 吃鸡 python开发_python青少年编程第三季——14、吃鸡联盟之亚瑟开枪(上)
  8. Windows bat脚本学习二(命令窗口指令)
  9. 《深入浅出通信原理》学习笔记(目录)
  10. pdf转换成html转换器 2015中文破解版