在又一次嘗試開鎖小黃車失敗後,我仍是選擇了坐公交上班。與以前坐地鐵不一樣,新的住處離公司不遠,也沒有地鐵線路,出行要麼坐公交要麼騎小黃。編程
很無奈,短短三千米起碼一半時間都在堵車,與往常不一樣的是,今天的我沒有打開手機,而是想到了一個好玩的問題:這馬路上來來每每的車輛,是否是和計算機中的線程有那麼一份類似。多線程
還別說,說到線程,這路上擁堵的車輛就像是一個多線程的程序,併發量(車流量)很大,可是速度會隨着數量的增加而下降,可是承載的人數會增長。因此高峯期坐公交上班會不太穩定,有遲到的風險。那麼地鐵呢,忽然又想到了這個,幾乎沒有誤點的交通工具。速度快,可是線路單一,這不就至關於一個單線程的程序麼。併發
說到這裏,不得不提到線程中的一個兵家常爭的問題:多線程和單線程哪一個效率更高?看到這裏我想應該會很清楚了吧,多線程就像公路,靈活,四通八達,可是每一個單獨的線程(車輛)承載量不大,不然效率就會下降。而單線程就像是軌道路線,線路單一,可是單次線路承載量大,速度快。因此說:多線程和單線程的應用場景不一樣,數量多、任務少的適合多線程,數量較少,單體較大的適合單線程,二者沒有孰好孰壞,看具體場景的應用各取所需。框架
好在路程不長,20多分鐘後我下車了,離公司還要走一段距離,走在路上內心想:都想到這了,不如再想一想線程中還有什麼問題呢?靈機一動,對了,還有個很經典的競爭和死鎖的問題。那在這個交通網中,這個問題有體現麼?答案是有的,咱們能夠把每一條單獨的道路當作一個單獨的資源,把每一輛車看作是一個單獨的線程,那麼當兩輛車同時想進某一條路時,就產生了資源的競爭。那麼死鎖是什麼呢?A,B兩個只有一個車位的道路,A路的車想進B路,B路的車想進入A路,而後你們都在那等着,誰也過不去,就產生了死鎖。那麼問題來了,現實中這種狀況會出現麼?答案是確定的,不過通常在老式小區或者其餘只有一條車身的道路上纔會發生。現代道路或者新式小區通常都會至少分紅兩條道,進一條,出一條。這也是避免線程死鎖的一種思路吧:對資源的請求最好是單向的,避免循環引用。異步
最後簡單說下線程中同步異步的問題吧,這個讓我想到了Java7新增的一個Fork/Join框架,clojure語言中,用它實現了並行計算fold。它的原理簡單說就是多個線程,先結束的等待下一個,而後一步步的將結果合併。這和咱們的公路網有什麼關係呢?打個簡單的比方,一個旅行團計劃下午去下一個景點,這時候多是你們如今一個地方集合,而後統計人數齊了,統一送去景點。也能夠是你們自行選擇交通工具去景點,而後在景點門口統計人數,等待人齊。工具
時間短暫,一會就到公司了,關於線程的問題不少,沒法一一細想,若是大家看了文章有什麼想法或者指點個人錯誤的,均可以和我交流,一直都相信,生活到處是編程。線程