JAVA併發之基礎概念

1.併發和並行

舉個例子

併發(concurrency):併發的關鍵在於有處理多個任務的能力,但並不必定就是同時處理.java

例1: 吃飯時,電話響起,暫時停下吃飯的動做,接完電話後繼續吃飯.多線程

例2: 一我的吃3個饅頭併發

並行(parallelism):並行的關鍵在於同時處理多個任務app

例子1: 吃飯時,電話響起,同時進行吃飯和電話2個動做異步

例子2: 三我的吃3個饅頭async

「併發」指的是程序的結構,「並行」指的是程序運行時的狀態

即便不看詳細解釋,也請記住這句話.函數

並行(parallelism)

這個概念很好理解。所謂並行,就是同時執行的意思,無需過分解讀。判斷程序是否處於並行的狀態,就看同一時刻是否有超過一個「工做單位」在運行就行了。因此,單線程永遠沒法達到並行狀態線程

要達到並行狀態,最簡單的就是利用多線程多進程設計

注意: Python 的多線程因爲存在著名的 GIL(通俗理解爲就是一把全局排他鎖),沒法讓兩個線程真正「同時運行」,因此其實是沒法到達並行狀態的。3d

併發(concurrency)

要理解「併發」這個概念,必須得清楚,併發指的是程序的「結構」。當咱們說這個程序是併發的,實際上,這句話應當表述成「這個程序採用了支持併發的設計」。好,既然併發指的是人爲設計的結構,那麼怎樣的程序結構才叫作支持併發的設計?

正確的併發設計的標準是:兩個任務能夠在重疊的時間段內啓動、運行和完成(two tasks can start, run, and complete in overlapping time periods)

併發 並行 區分的關鍵:

是不是同時處理多個任務

2.同步和異步

  • 所謂同步,就是在發出一個調用時,在沒有獲得結果以前,該調用就不返回。可是一旦調用返回,就獲得返回值了。
  • 異步則是相反,調用在發出以後,這個調用就直接返回了,因此沒有返回結果。換句話說,當一個異步過程調用發出後,調用者不會馬上獲得結果。而是在調用發出後,被調用者經過狀態、通知來通知調用者,或經過回調函數處理這個調用。

區分的關鍵

同步和異步關注的是消息通訊機制 (synchronous communication/ asynchronous communication)

3.阻塞與非阻塞

  • 阻塞調用是指調用結果返回以前,當前線程會被掛起。調用線程只有在獲得結果以後纔會返回。
  • 非阻塞調用指在不能馬上獲得結果以前,該調用不會阻塞當前線程。

區分的關鍵

阻塞和非阻塞關注的是程序在等待調用結果(消息,返回值)時的狀態.

「阻塞」與"非阻塞" 與 "同步"與「異步"不能簡單的從字面理解
前者關注的是等待結果時的狀態,後者關注的是通訊機制

關注公衆號:java寶典
a

相關文章
相關標籤/搜索