Java併發程式設計基礎概念
阿新 • • 發佈:2020-07-23
這篇隨筆梳理一下Java併發程式設計的一些基礎概念。包括同步非同步、程序執行緒、併發並行。
同步和非同步是指方法的呼叫,我們用一張圖來形容:
同步方法一旦呼叫後,呼叫者必需等方法執行完畢後才能進行後續的行為;
非同步方法一旦被呼叫則會立即返回,呼叫者可以繼續後面的行為,非同步方法一般會在另外一個執行緒中執行;如果非同步方法有返回結果,通常會由系統通知呼叫者;
其次是程序、執行緒;
- 程序就可以視為程式的一個例項。大部分程式可以同時執行多個例項程序(例如記事本、畫圖、瀏覽器等),也有的程式只能啟動一個例項程序(例如網易雲音樂、360 安全衛士等)
單核 cpu 下,執行緒實際還是序列執行
的。作業系統中有一個元件叫做任務排程器,會將 cpu 的時間片(windows下時間片最小約為 15 毫秒)分給不同的程式使用,由於 cpu 線上程間(時間片很短)的切換非常快,我們感覺是同時執行
的 。總結為一句話就是: 微觀序列,巨集觀並行。用圖例表示如下,cpu輪流執行這些執行緒。
時間片1 | 時間片2 | 時間片3 | 時間片4 | |
---|---|---|---|---|
core | 執行緒 1 | 執行緒 2 | 執行緒 3 | 執行緒 4 |
時間片1 | 時間片2 | 時間片3 | 時間片4 | |
---|---|---|---|---|
core1 | 執行緒 1 | 執行緒 1 | 執行緒 3 | 執行緒 3 |
core2 | 執行緒 2 | 執行緒 4 | 執行緒 2 |
同樣可以用圖來描述:
總結一下就是(Rob Pike):
- 併發(concurrent)是同一時間應對(dealing with)多件事情的能力
- 並行(parallel)是同一時間動手做(doing)多件事情的能力
大多時候並行和併發是同時進行的,舉一個生活中的例子來說明:
- 家裡面保姆做飯、打掃衛生、給孩子餵奶,她一個人輪流交替做這多件事,這時就是併發
- 又僱了個保姆,三個人一個專做飯、一個專打掃衛生、一個專餵奶,互不干擾,這時是並行。