簡介
在現代程式中,我們經常會使用到兩個關鍵詞:併發concurrency和並行parallelism,雖然兩者的英文單詞區別很大,但是翻譯成中文之後幾乎是一樣的。雖然中文以其優美的語法和工整的寫法凌駕於英語之上,但是帶來的複雜性和翻譯的多意性往往會給技術工作者一點點煩惱。
沒關係,今天本文為大家解密一下併發和並行的聯絡和區別。
注意,本文所講的併發和並行的概念都是指在同一個應用程式中。
併發和並行
事實上除了併發concurrency和並行parallelism,還有2個狀態:並行執行Parallel Execution 和 並行併發執行 Parallel Concurrent Execution。接下來我們來分別講解一下他們的區別。
併發concurrency
大家知道java中有一個非常有用的併發包叫做java.util.concurrent,裡面有很多非常有用的類,用來處理多執行緒之間的資源競爭問題。根據併發包的作用,大家應該就可以猜到併發和並行的最大區別在於是否有資源搶佔的情況。
我們來舉個最近爆火的打新冠疫苗的例子,在本地沒有確診病例之前,大家都不慌著打疫苗,資源相對就比較多,不需要搶,所以不存在併發問題。
但是當一個地方出現了確診病例之後,大家都慌了,於是搶著去打疫苗,造成了資源的緊張,於是產生了併發問題。
為了更好的描述這個併發問題,假設我們有10個人排成了兩支隊伍要去打疫苗,結果只有一個打疫苗的視窗。那麼一個很可能的策略就是視窗交替給兩個隊伍的人打疫苗。我們做個圖來表示:
上圖表示的就是併發concurrency的情況,一個視窗同時只能處理一個任務,所以兩個隊伍在爭奪視窗這個資源。
資源爭奪過程中會產生各種鎖的問題,從而需要特別小心。
並行執行Parallel Execution
並行執行的意思是兩個互相不干擾的任務同時進行。也就是說任務之間並沒有資源的競爭關係,所以不會產生鎖的問題。如果用在打疫苗的問題上,並行執行就是說現在有兩個視窗,每個佇列都可以分到一個視窗,不會產生競爭關係。
並行執行是程式執行中最理想的情況,這種情況下資源是充足的,只需要考慮具體的業務邏輯即可,並不需要考慮他們之間的互動和資源佔用關係。
並行併發執行 Parallel Concurrent Execution
並行併發執行的的意思就是在並行的過程中還存在著併發。以打疫苗的例子就是,現在有兩個體育館,每個體育館都只有一個打疫苗的視窗,對於兩個體育館來說他們是並行的。但是對於每個體育館中的每個視窗來說,又是併發執行的。
並行併發執行狀態應該是一般的應用程式中的基本狀態。執行不同任務的執行緒是並行執行的,他們的資源是隔離的,所以互不影響。但是執行同一個任務的多個執行緒之間又是併發的,他們之間會搶佔資源,所以需要進行併發控制。
並行parallelism
parallelism和Parallel翻譯起來好像沒有什麼太大的區別,前面一個是專業的計算機名稱表示並行性,後面一個可以用在任何地方,表示並行。
那麼在計算機中,parallelism指的是什麼意思呢?
其實它是指一個任務的可並行程度。比如5個人的打疫苗的任務,可以將5個人分成5個小組,每個小組都可以去爭取自己的資源來執行,這其中可以併發也可以並行,這就是並行性parallelism的意思。我們用下面的圖來表示:
總結
講了這麼多,大家明白他們之間的區別了嗎?
本文已收錄於 http://www.flydean.com/05-concurrency-parallelism/
最通俗的解讀,最深刻的乾貨,最簡潔的教程,眾多你不知道的小技巧等你來發現!
歡迎關注我的公眾號:「程式那些事」,懂技術,更懂你!