轉載請註明原創出處,謝謝!
有些知識很久不看很容易就會忘掉,尤其是一些概念性知識。好記性不如爛筆頭,不如記下來便於以後翻看。
1、併發和並行
- 併發:處理多個任務的能力,不一定要同時。
- 並行:同時處理多個任務的能力。
二者區別在於是否同時。參考:併發與並行的區別?
2、進程和線程
放幾個比較有趣的答案,參考:線程和進程的區別是什麼?
-
進程和線程都是一個時間段的描述,是 CPU 工作時間段的描述,只不過顆粒大小不同。
進程就是時間總和 = CPU 加載程序上下文的時間 + CPU 執行時間 + CPU 保存程序上下文的時間 線程也是時間總和 = CPU 加載線程上下文的時間 + CPU 執行時間 + CPU 保存線程上下文的時間
-
進程是爹媽,管着衆多的線程兒子
3、線程安全性
當多個線程訪問某個類時,不管運行時環境採用何種調度方式或者這些線程將如何交替執行,並且在主調代碼中不需要任何額外的同步或協同,這個類都能表現出正確的行爲,那麼就稱這個類是線程安全的。摘自:《Java 併發編程實戰》
4、競態條件和臨界區
當多個線程競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。導致競態條件發生的代碼區稱作臨界區。
5、線程的生命週期
- NEW:新建
- RUNNABLE:運行
- BLOCKED:阻塞
- WAITING:無限期等待
- TIMED_WAITING:限期等待
- TERMINATED:結束
6、Java 線程調度
線程調度是指系統爲線程分配處理器使用權的過程,主要調度方式有兩種,分別是協同式線程調度和搶佔式線程調度。
7、殭屍進程和孤兒進程
- 一個進程使用
fork
創建子進程,如果子進程退出,而父進程並沒有調用wait
或waitpid
獲取子進程的狀態信息,那麼子進程的進程描述符仍然保存在系統中。這種進程稱之爲殭屍進程(或稱僵死進程)。 - 一個父進程退出,而它的一個或多個子進程還在運行,那麼那些子進程將成爲孤兒進程。
參考資料:
(1)《深入理解 Java 虛擬機》周志明 著.
(2)《Java 併發編程實戰》
(3)併發與並行的區別?
(4)線程和進程的區別是什麼?