天天看點

【并發】基本概念參考書籍概念

目錄

  • 參考書籍
  • 概念
    • 程序&線程
      • 線程
    • 同步&異步
    • 并發&并行
    • 臨界區
    • 阻塞Blocking&非阻塞Non-Blocking
    • 死鎖DeadLock&饑餓Starvation&活鎖LiveLock
      • 死鎖
        • 産生死鎖的四個必要條件
        • 線程死鎖的避免
      • 饑餓
      • 活鎖

參考書籍

參考書籍:《Java高并發程式設計》、《Java核心技術卷I》

概念

程序&線程

程序:程式的一次執行過程,是系統運作程式的基本機關。

線程:比程序更小的執行機關。一個程序在執行的過程中可以産生多個線程。同類的多個線程共享程序的堆和方法區資源,但每個線程有自己的程式計數器、虛拟棧和本地方法棧。

線程

【并發】基本概念參考書籍概念
  1. 新建立棧:new Thread()
  2. 可運作線程:調用start()方法,線程處于runnable狀态。可運作的線程可能正在運作也可能沒有運作,這取決于作業系統給線程提供運作的時間。
  3. 被阻塞/等待:暫時不活動,不運作任何代碼且消耗最少資源,直到線程排程器重新激活它。
    • 阻塞:線程試圖擷取一個内部的對象鎖,而該鎖被其他線程持有。當該鎖被釋放且該線程允許持有他,則阻塞變為非阻塞。
    • 等待:線程等待另一個線程通知排程器一個條件時,進入等待狀态。Object.wait或Thread.join方法活着使用java.util.concurrent庫中的Lock或Condition時可能會出現此類狀況
    • 計時等待:有幾個方法有一個逾時參數,調用它們導緻線程進入計時等待狀态。一直保持到逾時期滿或者接收到适當的通知。帶有逾時參數的方法有:Thread.sleep,Object.wait,Thread.join,Lock.tryLock,Condition.await。
      【并發】基本概念參考書籍概念
    關于線程+Java的更多資訊,會新開一篇部落格記錄。

同步&異步

同步和異步用來形容一次方法的調用。

同步:調用一旦開始,調用者必須等到方法調用傳回後,才能繼續後續行為。

異步:調用方法開始,立即傳回,調用者可繼續後面操作,調用方法開辟新線程執行,方法結束後通知調用者接收傳回。

【并發】基本概念參考書籍概念

并發&并行

都可以表示兩個或多個任務一起執行,但側重點不同。

并發:偏重于多個任務交替執行,而多個任務之間可能還是串行的。

并行:真正意義上的同時執行。

【并發】基本概念參考書籍概念

一個CPU使用多程序、多線程任務。一般是并發的。

多個CPU可實作并行操作。

臨界區

用來表示一種公共資源、共享資料,可被多個線程使用。但每一次隻能被一個線程使用,一旦資源被占用,其他線程必須等待。

臨界區是被保護的對象,這就涉及到加鎖、解鎖等任務來保護臨界區啦。

阻塞Blocking&非阻塞Non-Blocking

阻塞和非阻塞是用來形容多線程間的互相影響的。

阻塞:臨界區資源被一個線程占用,其他線程則需要等待,線程挂起,這種情況就是阻塞。如果占用資源的線程一直不釋放資源,那阻塞在此的線程都不能工作。

非阻塞:強調-沒有一個線程能妨礙其他線程執行,是以線程都會嘗試不斷前向執行。

死鎖DeadLock&饑餓Starvation&活鎖LiveLock

死鎖、饑餓、活鎖都屬于多線程的活躍性問題。如果發生上三種情況,多線程可能不再活躍,很難往下執行。

死鎖

死鎖:多個線程同時被阻塞,它們中的一個或者全部都在等待某個資源的釋放。線程被無限期阻塞,程式不能正常終止。

産生死鎖的四個必要條件

  1. 互斥條件:資源任意時刻隻能被一個線程占用。
  2. 請求與保持條件:一個程序請求資源被阻塞,但其對已獲得的資源保持不放。(這裡為什麼是程序而不是線程?
  3. 不剝奪條件:線程已獲得的資源不能被強行剝奪,除非是自己使用完畢自主釋放。
  4. 循環等待條件:等待資源的程序形成一種頭尾相接的關系。

線程死鎖的避免

破壞掉四個必要條件其中一個就行。

  1. 破壞互斥:因為臨界區是互斥通路,鎖就是用來互斥的,是以沒辦法破壞。
  2. 破壞請求與保持條件:在最開始就一次性申請完所有資源。
  3. 破壞不剝奪條件:如果申請其他資源申請不到,可以主動釋放占有資源。
  4. 破壞循等條件:按序申請來預防。按某一順序申請資源,釋放資源則反序釋放。

饑餓

饑餓:指線程無法獲得需要的資源,導緻一直無法執行。

可能發生原因:

  1. 優先級太低,高優先級不斷搶占資源
  2. 某個線程一站占用資源不釋放。

與死鎖相比,饑餓還可能是在未來一段時間内可以解決。

活鎖

活鎖:秉承”謙讓“原則的兩個線程,主動将資源釋放給對方,那麼資源會在兩者之間跳動,而沒有一個線程可以拿到資源。