1. 程式人生 > 實用技巧 >JAVA併發之基礎概念

JAVA併發之基礎概念

1.併發和並行

舉個例子

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

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

例2: 一個人吃3個饅頭

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

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

例子2: 三個人吃3個饅頭

“併發”指的是程式的結構,“並行”指的是程式執行時的狀態

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

並行(parallelism)

這個概念很好理解。所謂並行,就是同時執行的意思,無需過度解讀。判斷程式是否處於並行的狀態,就看同一時刻是否有超過一個“工作單位”在執行就好了。所以,單執行緒永遠無法達到並行狀態

要達到並行狀態,最簡單的就是利用多執行緒多程序

注意: Python 的多執行緒由於存在著名的 GIL(通俗理解為就是一把全域性排他鎖),無法讓兩個執行緒真正“同時執行”,所以實際上是無法到達並行狀態的。

併發(concurrency)

要理解“併發”這個概念,必須得清楚,併發指的是程式的“結構”。當我們說這個程式是併發的,實際上,這句話應當表述成“這個程式採用了支援併發的設計”。好,既然併發指的是人為設計的結構,那麼怎樣的程式結構才叫做支援併發的設計?

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

併發 並行 區分的關鍵:

是否是同時處理多個任務

2.同步和非同步

  • 所謂同步,就是在發出一個呼叫時,在沒有得到結果之前,該呼叫就不返回。但是一旦呼叫返回,就得到返回值了。
  • 非同步則是相反,呼叫在發出之後,這個呼叫就直接返回了,所以沒有返回結果。換句話說,當一個非同步過程呼叫發出後,呼叫者不會立刻得到結果。而是在呼叫發出後,被呼叫者通過狀態、通知來通知呼叫者,或通過回撥函式處理這個呼叫。

區分的關鍵

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

3.阻塞與非阻塞

  • 阻塞呼叫是指呼叫結果返回之前,當前執行緒會被掛起。呼叫執行緒只有在得到結果之後才會返回。
  • 非阻塞呼叫指在不能立刻得到結果之前,該呼叫不會阻塞當前執行緒。

區分的關鍵

阻塞和非阻塞關注的是程式在等待呼叫結果(訊息,返回值)時的狀態.

“阻塞”與"非阻塞" 與 "同步"與“非同步"不能簡單的從字面理解
前者關注的是等待結果時的狀態,後者關注的是通訊機制
關注公眾號:java寶典