在又一次尝试开锁小黄车失败后,我仍是选择了坐公交上班。与以前坐地铁不一样,新的住处离公司不远,也没有地铁线路,出行要么坐公交要么骑小黄。编程
很无奈,短短三千米起码一半时间都在堵车,与往常不一样的是,今天的我没有打开手机,而是想到了一个好玩的问题:这马路上来来每每的车辆,是否是和计算机中的线程有那么一份类似。多线程
还别说,说到线程,这路上拥堵的车辆就像是一个多线程的程序,并发量(车流量)很大,可是速度会随着数量的增加而下降,可是承载的人数会增长。因此高峰期坐公交上班会不太稳定,有迟到的风险。那么地铁呢,忽然又想到了这个,几乎没有误点的交通工具。速度快,可是线路单一,这不就至关于一个单线程的程序么。并发
说到这里,不得不提到线程中的一个兵家常争的问题:多线程和单线程哪一个效率更高?看到这里我想应该会很清楚了吧,多线程就像公路,灵活,四通八达,可是每一个单独的线程(车辆)承载量不大,不然效率就会下降。而单线程就像是轨道路线,线路单一,可是单次线路承载量大,速度快。因此说:多线程和单线程的应用场景不一样,数量多、任务少的适合多线程,数量较少,单体较大的适合单线程,二者没有孰好孰坏,看具体场景的应用各取所需。框架
好在路程不长,20多分钟后我下车了,离公司还要走一段距离,走在路上内心想:都想到这了,不如再想一想线程中还有什么问题呢?灵机一动,对了,还有个很经典的竞争和死锁的问题。那在这个交通网中,这个问题有体现么?答案是有的,咱们能够把每一条单独的道路当作一个单独的资源,把每一辆车看作是一个单独的线程,那么当两辆车同时想进某一条路时,就产生了资源的竞争。那么死锁是什么呢?A,B两个只有一个车位的道路,A路的车想进B路,B路的车想进入A路,而后你们都在那等着,谁也过不去,就产生了死锁。那么问题来了,现实中这种状况会出现么?答案是确定的,不过通常在老式小区或者其余只有一条车身的道路上才会发生。现代道路或者新式小区通常都会至少分红两条道,进一条,出一条。这也是避免线程死锁的一种思路吧:对资源的请求最好是单向的,避免循环引用。异步
最后简单说下线程中同步异步的问题吧,这个让我想到了Java7新增的一个Fork/Join框架,clojure语言中,用它实现了并行计算fold。它的原理简单说就是多个线程,先结束的等待下一个,而后一步步的将结果合并。这和咱们的公路网有什么关系呢?打个简单的比方,一个旅行团计划下午去下一个景点,这时候多是你们如今一个地方集合,而后统计人数齐了,统一送去景点。也能够是你们自行选择交通工具去景点,而后在景点门口统计人数,等待人齐。工具
时间短暂,一会就到公司了,关于线程的问题不少,没法一一细想,若是大家看了文章有什么想法或者指点个人错误的,均可以和我交流,一直都相信,生活到处是编程。线程