从找对象到多线程

最近遇到了一个和多线程有关的事,顺便简单复习了下相关概念,稍后举个栗子🌰来解释下。安全

进程 and 线程

进程咱们都知道,就是应用程序的启动实例。好比咱们运行一个游戏,打开一个软件,就是开启了一个进程。微信

而线程从属于进程,是程序的实际执行者。一个进程至少包含一个主线程,也能够有更多的子线程。多线程

咱们能够简单的理解:为了作一件事,我开了一个进程,为了让这件事更有效率的完成,我开了多个线程。工具

从找对象入手加深理解

若是这么说仍是不清楚的话,咱们以一个找对象的例子来加深理解:学习

​ 读研了,望着身边的小伙伴一个个都是成双成对,笔者有一个万年单身的好基友就跟一条酸菜鱼似的(又酸又菜又多余),想着要不也找个女友吧?因而就建立了一个名为**「找对象」的进程**。可是学校女生太多了,若是一个一个试的话不知道啥时候才能脱单。这时候,万能的度娘给出了建议,为何不一样时下手呢?线程

因而,他就建立了两个「撩妹」的线程,每一个线程负责撩一个妹子。但这时就有问题出来了。cdn

​ 虽然他能够同时撩两个妹子,可是有些事情就是没办法同时和两个妹子作,好比上课、吃饭、散步。这个时候就须要**「数据保护」。作这些事情的时候,他一次只能跟一个妹子作,这就叫作「临界区」。他撩的两个妹子,一个是红玫瑰,一个是白玫瑰,各有各的特色,这是她们的「私有属性」。这两个妹子均可以跟他约会,此时他就是一个「共享内存」。若是某一天他跟其中一个妹子在外面约会,那另外一个撩妹线程就只能「阻塞」了。可是为了防止后院起火,不让另外一个妹子不爽,他就只能发条朋友圈说本身在学习,不想被打扰,这就叫「互斥锁」。同时为了避免让她们影响对方的存在,他用QQ叫着其中一个的小名,微信倒是另外一个的情侣头像,这就是「消息传递」**。对象

​ 上述两个线程在某种意义上就构成了**「竞态条件」(我的认为叫作「竞争状态」会更好)。若是他只有这两个线程的话,想要完成「找对象」这个进程,就只能看这两个线程谁的执行效率更高(其实就是看谁先运行完)**了。这么一看,个人好基友貌似很快就能够完成「找对象」这一进程了,由于不管是哪一个线程,只要有一个「撩妹」线程结束了,整个进程也就结束了。blog

​ 可是在结束前可能会出现一些问题(注意这里是可能),若是他在排约会档期时一旦没有进行良好的调度,就颇有可能会出现两个妹子约在同一天约会,基友却没办法到达的状况,这种状况就叫「死锁」,即较长时间的等待或资源竞争。亦或是若是不幸被两个妹子都发觉了对方的存在,却又为表大度,你让我我让你,最终致使「找对象」进程没法进行下去,这就叫作「活锁」。 若是此时出现了一个*「工具人」妹子,主动倒追我基友,这样的话即便被加入了「找对象」的进程,也可能会由于一系列问题始终无法和他单独约会(毕竟还有两个「撩妹」线程在进行着),这种状况就叫作「饥饿」*。 这三种状况总结一下就是:游戏

  1. 死锁:争来争去 谁也得不到
  2. 活锁:让来让去 谁都不拥有
  3. 饥饿:排多久 都轮不到本身

假若我基友最后撩成功的女友并非他最喜欢的那我的,即最终的运行结果和预期不一样,这就叫**「线程不安全」。反之,若是最后撩成功的妹子是他最喜欢的,即最终的结果和预期相同,那这个就叫「线程安全」**。

这么一看,真是人生如戏。只是可悲的是,我本觉得如今执行的是一个单进程,却没想到也只是别人的一个线程罢了。


若是你以为个人文章还不错,不妨扫描下方二维码关注我,你的支持是我前进的最大动力💪

相关文章
相关标签/搜索