浅谈多线程

多线程
今天主要想讲的是线程安全问题,为什么多线程情况下会出现线程不安全问题?

 

什么是多线程?
可以简单的理解为:即就是一个程序中有多个线程在同时执行。
举例:我们使用QQ音乐同时下载多首音乐时,QQ音乐程序会创建多个线程来下载音乐。

 

并行
我们先说下串行。关于串行这个很好理解。假设在单线程情况下,我们使用QQ音乐来串行的下载5首音乐的话,那下载顺序和进度就是A下载完成了然后下载B,顺序就是A-B-C-D-E。


那么我们来谈下并行,在多条线程的情况下,QQ音乐程序是怎么完成音乐的下载了?多线程情况下,程序会并发的来执行线程里的下载音乐的任务,从而会无序的完成5首音乐的下载。而不是需要等待A下载完成才能下载B,而是几乎"同时"执行下载的。

 

关于线程安全
在实际的开发过程中,其实我们写出的代码可能存在多线程安全问题。比如:2条线程同时来对数组进行删除操作,最后导致程序的crash。

【比如数组 nums = [1,2,3,4,5],线程A获取nums后线程B也获取nums,然后线程A执行remove(nums[4]),执行完成后nums=[1,2,3,4],然后这个时候B也执行执行remove(nums[4]),导致crash,因为数组越界】


举一个简单的例子来说明下多线程下存在的安全问题: 

现在有一个Integer变量,有2个线程分别是线程A和线程B对其进行加1操作,如果不设置锁的话,会造成以下的问题

 

 

 

 

  1. 开始的时候,线程A读取integer变量为17,过了一会儿线程B也获取了integer变量,此时值也为17;
  2. 然后线程A执行加1操作,此时integer值变为18;
  3. 又过了一会儿,线程B执行加1操作,integer的值还是18,因为线程B在第一步获取的变量值为17;
  4. 线程A和线程B将加1后的值18进行写入;
  5. 最后,我们发现写入的值18和预期的值19不符,所以结果错误。

 
那如何保证线程安全了?
解决方案:使用线程同步技术(同步,就是协同步调,按预定的先后次序进行)
常见的线程同步技术是:加锁

 

 

 

 

如图所示:
1.线程A在获取integer变量时,就lock加锁,这个时候其他的线程就不能获取integer变量了

2.线程A执行加1操作,然后写入完成后,unlock解锁,让别的线程可以访问integer变量
线程B重复上述操作,从而保证了线程的安全。

 
总结
这是一个非常简单的多线程模型,在实际的开发过程中,多线程的情况可能会复杂些。例如:多个线程对数组进行删除操作,如果不保证线程安全的话,最后可能会导致数组越界然后程序crash;
当然,多线程其实也不难,因为我们可以使用锁的机制来处理线程安全问题,那么你知道一共有多少种锁吗,为什么会出现不同种类的锁吗?

欢迎关注【无量测试之道】公众号,回复【领取资源】
Python编程学习资源干货、
Python+Appium框架APP的UI自动化、
Python+Selenium框架Web的UI自动化、
Python+Unittest框架API自动化、

资源和代码 免费送啦~
文章下方有公众号二维码,可直接微信扫一扫关注即可。

备注:我的个人公众号已正式开通,致力于测试技术的分享,包含:大数据测试、功能测试,测试开发,API接口自动化、测试运维、UI自动化测试等,微信搜索公众号:“无量测试之道”,或扫描下方二维码:

 

 添加关注,让我们一起共同成长!

posted on 2021-03-29 18:05  Wu_Candy  阅读(63)  评论(0编辑  收藏  举报