簡介
在現代程式中,我們經常會使用到兩個關鍵詞:并發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/最通俗的解讀,最深刻的幹貨,最簡潔的教程,衆多你不知道的小技巧等你來發現!
歡迎關注我的公衆号:「程式那些事」,懂技術,更懂你!