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寶典
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/185449.html
標籤:Java
上一篇:Java 自定義泛型

