Java 多線程學習(1)一些容易被遺忘的基礎概念

轉載請註明原創出處,謝謝!

HappyFeet的博客

有些知識很久不看很容易就會忘掉,尤其是一些概念性知識。好記性不如爛筆頭,不如記下來便於以後翻看。


1、併發和並行

  • 併發:處理多個任務的能力,不一定要同時
  • 並行:同時處理多個任務的能力。

二者區別在於是否同時。參考:併發與並行的區別?

2、進程和線程

放幾個比較有趣的答案,參考:線程和進程的區別是什麼?

  • 進程和線程都是一個時間段的描述,是 CPU 工作時間段的描述,只不過顆粒大小不同。

    進程就是時間總和 = CPU 加載程序上下文的時間 + CPU 執行時間 + CPU 保存程序上下文的時間
    
    線程也是時間總和 = CPU 加載線程上下文的時間 + CPU 執行時間 + CPU 保存線程上下文的時間 	
    
  • 進程是爹媽,管着衆多的線程兒子

3、線程安全性

當多個線程訪問某個類時,不管運行時環境採用何種調度方式或者這些線程將如何交替執行,並且在主調代碼中不需要任何額外的同步或協同,這個類都能表現出正確的行爲,那麼就稱這個類是線程安全的。摘自:《Java 併發編程實戰》

4、競態條件和臨界區

當多個線程競爭同一資源時,如果對資源的訪問順序敏感,就稱存在競態條件。導致競態條件發生的代碼區稱作臨界區。

5、線程的生命週期

  • NEW:新建
  • RUNNABLE:運行
  • BLOCKED:阻塞
  • WAITING:無限期等待
  • TIMED_WAITING:限期等待
  • TERMINATED:結束

6、Java 線程調度

線程調度是指系統爲線程分配處理器使用權的過程,主要調度方式有兩種,分別是協同式線程調度搶佔式線程調度

7、殭屍進程和孤兒進程

  • 一個進程使用 fork 創建子進程,如果子進程退出,而父進程並沒有調用 waitwaitpid 獲取子進程的狀態信息,那麼子進程的進程描述符仍然保存在系統中。這種進程稱之爲殭屍進程(或稱僵死進程)。
  • 一個父進程退出,而它的一個或多個子進程還在運行,那麼那些子進程將成爲孤兒進程。

參考資料:

(1)《深入理解 Java 虛擬機》周志明 著.

(2)《Java 併發編程實戰》

(3)併發與並行的區別?

(4)線程和進程的區別是什麼?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章