Java併發編程之進程與線程

我們來看一下操作系統、進程、線程的包含關係:

  • 操作系統是包含多個進程的容器,而每個進程是包含多個線程的容器

什麼是進程?

  • 代碼角度:把一個類new出來是一個實例化的過程,進程就是對代碼的一種實例化;
  • 總結:進程是程序(理解爲我們寫的代碼)的真正運行實例,是系統資源(內存、CPU等)分配和調度的基本單位;

什麼是線程?

  • 線程是CPU的基本調度單位,每個線程執行的都是進程代碼的的某個片段;
  • 多個線程來幫助同一進程來執行代碼;

進程和線程的異同

  • 起源不同,先有進程再有線程爲了提高CPU的利用率,才誕生了線程
  • 概念不同,進程是有獨立功能的程序運行起來的活動,是系統分配資源(內存、CPU等)和調度的基本單位;而線程是CPU的基本調度單位
  • 內存共享方式不同,對於進程而言,不同的進程都會被操作系統分配一定的內存,但是不同進程的內存通常不共享,線程與線程之間的內存共享起來非常容易,因爲本身服務於一個進程,所以線程可以直接訪問共享內存,不需要處理
  • 擁有的資源不同,線程之間共享的內容包括:進程代碼段、進程的共有數據、進程用戶ID與進程組ID;線程獨有的內容包括:線程ID、線程的堆棧
  • 數量不同,一個進程至少得擁有一個線程,否則就沒有辦法執行了;
  • 開銷不同,線程的創建、終止、線程的切換開銷都小於進程
  • 生命週期相同,進程和線程從創建到結束都有就緒,等待,運行

什麼是多線程?

  • 多線程是指如果一個程序允許兩個或以上的線程,那麼它就是多線程程序。多線程是指在單個進程中運行多個線程
  • 使用多線程最主要的目的:提高CPU利用率,可以提高處理速度,避免無效等待,卡頓等問題;

使用場景

  • 多任務
  • 高併發
  • NIO

多線程的侷限

  • 性能問題:上下文切換帶來的消耗
  • 線程安全問題:數據安全問題(比如i++),死鎖,活躍性問題(飢餓、活鎖)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章