选择

在又一次尝试开锁小黄车失败后,我还是选择了坐公交上班。与之前坐地铁不同,新的住处离公司不远,也没有地铁线路,出行要么坐公交要么骑小黄。

公交

很无奈,短短三公里起码一半时间都在堵车,与往常不同的是,今天的我没有打开手机,而是想到了一个好玩的问题:这马路上来来往往的车辆,是不是和计算机中的线程有那么一份相似。

还别说,说到线程,这路上拥堵的车辆就像是一个多线程的程序,并发量(车流量)很大,但是速度会随着数量的增长而降低,但是承载的人数会增加。所以高峰期坐公交上班会不太稳定,有迟到的风险。那么地铁呢,突然又想到了这个,几乎没有误点的交通工具。速度快,但是线路单一,这不就相当于一个单线程的程序么。

说到这里,不得不提到线程中的一个兵家常争的问题:多线程和单线程哪个效率更高?看到这里我想应该会很清楚了吧,多线程就像公路,灵活,四通八达,但是每个单独的线程(车辆)承载量不大,否则效率就会降低。而单线程就像是轨道路线,线路单一,但是单次线路承载量大,速度快。所以说:多线程和单线程的应用场景不同,数量多、任务少的适合多线程,数量较少,单体较大的适合单线程,两者没有孰好孰坏,看具体场景的应用各取所需。

余路

好在路程不长,20多分钟后我下车了,离公司还要走一段距离,走在路上心里想:都想到这了,不如再想想线程中还有什么问题呢?灵机一动,对了,还有个很经典的竞争和死锁的问题。那在这个交通网中,这个问题有体现么?答案是有的,我们可以把每一条单独的道路看成一个单独的资源,把每一辆车看做是一个单独的线程,那么当两辆车同时想进某一条路时,就产生了资源的竞争。那么死锁是什么呢?A,B两个只有一个车位的道路,A路的车想进B路,B路的车想进入A路,然后大家都在那等着,谁也过不去,就产生了死锁。那么问题来了,现实中这种情况会出现么?答案是肯定的,不过一般在老式小区或者其他只有一条车身的道路上才会发生。现代道路或者新式小区一般都会至少分成两条道,进一条,出一条。这也是避免线程死锁的一种思路吧:对资源的请求最好是单向的,避免循环引用。

最后简单说下线程中同步异步的问题吧,这个让我想到了Java7新增的一个Fork/Join框架,clojure语言中,用它实现了并行计算fold。它的原理简单说就是多个线程,先结束的等待下一个,然后一步步的将结果合并。这和我们的公路网有什么关系呢?打个简单的比方,一个旅行团计划下午去下一个景点,这时候可能是大家现在一个地方集合,然后统计人数齐了,统一送去景点。也可以是大家自行选择交通工具去景点,然后在景点门口统计人数,等待人齐。

写在最后

时间短暂,一会就到公司了,关于线程的问题很多,无法一一细想,如果你们看了文章有什么想法或者指点我的错误的,都可以和我交流,一直都相信,生活处处是编程。


pcChao
45 声望11 粉丝

一个菜鸟,专职是Java和大数据开发,兴趣是编程语言原理和linux操作系统