| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 移动开发 -> 实例说明 Android 多线程、多进程与全局变量之间的关系 -> 正文阅读 |
|
[移动开发]实例说明 Android 多线程、多进程与全局变量之间的关系 |
demo 地址?https://github.com/994955138/ConditionVariableDemo.git 我们先给结论,再用实例验证。 结论:进程是资源(CPU、内存等)分配的基本单位,它是程序执行时的一个实例。 1.线程是共享进程中的数据的,使用相同的地址空间,因此CPU切换一个线程的花费远比进程要小很多,同时创建一个线程的开销也比进程要小很多。线程之间的通信更方便,同一进程下的线程共享全局变量、静态变量等数据。不过如何处理好同步与互斥是编写多线程程序的难点。 2.进程有自己的独立地址空间,每启动一个进程,系统就会为它分配地址空间,建立数据表来维护代码段、堆栈段和数据段,所以不共享全局变量、静态变量等数据,但这种操作非常昂贵。进程之间的通信需要以通信的方式(IPC)进行。
? ? ? ? 首先我们来验证一下多线程之间的全局变量是否是共享的? for(int threadnum =0; threadnum<5;threadnum++){ createNewThread(threadnum); } private void createNewThread(int threadNum){ new Thread(){ @Override public 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 |
|
移动开发 最新文章 |
Vue3装载axios和element-ui |
android adb cmd |
【xcode】Xcode常用快捷键与技巧 |
Android开发中的线程池使用 |
Java 和 Android 的 Base64 |
Android 测试文字编码格式 |
微信小程序支付 |
安卓权限记录 |
知乎之自动养号 |
【Android Jetpack】DataStore |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 14:21:56- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |