架構之:併發和並行

簡介

在現代程序中,咱們常常會使用到兩個關鍵詞:併發concurrency和並行parallelism,雖然二者的英文單詞區別很大,可是翻譯成中文以後幾乎是同樣的。雖然中文以其優美的語法和工整的寫法凌駕於英語之上,可是帶來的複雜性和翻譯的多意性每每會給技術工做者一點點煩惱。java

不要緊,今天本文爲你們解密一下併發和並行的聯繫和區別。多線程

注意,本文所講的併發和並行的概念都是指在同一個應用程序中。

併發和並行

事實上除了併發concurrency和並行parallelism,還有2個狀態:並行執行Parallel Execution 和 並行併發執行 Parallel Concurrent Execution。接下來咱們來分別講解一下他們的區別。併發

併發concurrency

你們知道java中有一個很是有用的併發包叫作java.util.concurrent,裏面有不少很是有用的類,用來處理多線程之間的資源競爭問題。根據併發包的做用,你們應該就能夠猜到併發和並行的最大區別在因而否有資源搶佔的狀況。線程

咱們來舉個最近爆火的打新冠疫苗的例子,在本地沒有確診病例以前,你們都不慌着打疫苗,資源相對就比較多,不須要搶,因此不存在併發問題。翻譯

可是當一個地方出現了確診病例以後,你們都慌了,因而搶着去打疫苗,形成了資源的緊張,因而產生了併發問題。blog

爲了更好的描述這個併發問題,假設咱們有10我的排成了兩支隊伍要去打疫苗,結果只有一個打疫苗的窗口。那麼一個極可能的策略就是窗口交替給兩個隊伍的人打疫苗。咱們作個圖來表示:教程

<img src="https://img-blog.csdnimg.cn/20210527195139795.png" style="zoom:50%;" />隊列

上圖表示的就是併發concurrency的狀況,一個窗口同時只能處理一個任務,因此兩個隊伍在爭奪窗口這個資源。資源

資源爭奪過程當中會產生各類鎖的問題,從而須要特別當心。get

並行執行Parallel Execution

並行執行的意思是兩個互相不干擾的任務同時進行。也就是說任務之間並無資源的競爭關係,因此不會產生鎖的問題。若是用在打疫苗的問題上,並行執行就是說如今有兩個窗口,每一個隊列均可以分到一個窗口,不會產生競爭關係。

<img src="https://img-blog.csdnimg.cn/20210527200221921.png" style="zoom:50%;" />

並行執行是程序執行中最理想的狀況,這種狀況下資源是充足的,只須要考慮具體的業務邏輯便可,並不須要考慮他們之間的交互和資源佔用關係。

並行併發執行 Parallel Concurrent Execution

並行併發執行的的意思就是在並行的過程當中還存在着併發。以打疫苗的例子就是,如今有兩個體育館,每一個體育館都只有一個打疫苗的窗口,對於兩個體育館來講他們是並行的。可是對於每一個體育館中的每一個窗口來講,又是併發執行的。

<img src="https://img-blog.csdnimg.cn/20210527200758968.png" style="zoom:50%;" />

並行併發執行狀態應該是通常的應用程序中的基本狀態。執行不一樣任務的線程是並行執行的,他們的資源是隔離的,因此互不影響。可是執行同一個任務的多個線程之間又是併發的,他們之間會搶佔資源,因此須要進行併發控制。

並行parallelism

parallelism和Parallel翻譯起來好像沒有什麼太大的區別,前面一個是專業的計算機名稱表示並行性,後面一個能夠用在任何地方,表示並行。

那麼在計算機中,parallelism指的是什麼意思呢?

其實它是指一個任務的可並行程度。好比5我的的打疫苗的任務,能夠將5我的分紅5個小組,每一個小組均可以去爭取本身的資源來執行,這其中能夠併發也能夠並行,這就是並行性parallelism的意思。咱們用下面的圖來表示:

<img src="https://img-blog.csdnimg.cn/20210527202048311.png" style="zoom:50%;" />

總結

講了這麼多,你們明白他們之間的區別了嗎?

本文已收錄於 http://www.flydean.com/05-concurrency-parallelism/

最通俗的解讀,最深入的乾貨,最簡潔的教程,衆多你不知道的小技巧等你來發現!

歡迎關注個人公衆號:「程序那些事」,懂技術,更懂你!