3 Java併發性和多執行緒 多執行緒的代價

2021-09-07 12:11:59 字數 692 閱讀 1755

以下內容**

從乙個單執行緒的應用到乙個多執行緒的應用並不僅僅帶來好處,它也會有一些代價。不要僅僅為了使用多執行緒而使用多執行緒。而應該明確在使用多執行緒時能多來的好處比所付出的代價大的時候,才使用多執行緒。如果存在疑問,應該嘗試測量一下應用程式的效能和響應能力,而不只是猜測。

設計更複雜

雖然有一些多執行緒應用程式比單執行緒的應用程式要簡單,但其他的一般都更複雜。在多執行緒訪問共享資料的時候,這部分**需要特別的注意。執行緒之間的互動往往非常複雜。不正確的執行緒同步產生的錯誤非常難以被發現,並且重現以修復。

上下文切換的開銷

當cpu從執行乙個執行緒切換到執行另外乙個執行緒的時候,它需要先儲存當前執行緒的本地的資料,程式指標等,然後載入另乙個執行緒的本地資料,程式指標等,最後才開始執行。這種切換稱為「上下文切換」(「context switch」)。cpu會在乙個上下文中執行乙個執行緒,然後切換到另外乙個上下文中執行另外乙個執行緒。

上下文切換並不廉價。如果沒有必要,應該減少上下文切換的發生。

增加資源消耗

執行緒在執行的時候需要從計算機裡面得到一些資源。除了cpu,執行緒還需要一些記憶體來維持它本地的堆疊。它也需要占用作業系統中一些資源來管理執行緒。我們可以嘗試編寫乙個程式,讓它建立100個執行緒,這些執行緒什麼事情都不做,只是在等待,然後看看這個程式在執行的時候占用了多少記憶體。

(十五)Java併發性和多執行緒 死鎖

死鎖是兩個或更多執行緒阻塞著等待其它處於死鎖狀態的執行緒所持有的鎖。死鎖通常發生在多個執行緒同時但以不同的順序請求同一組鎖的時候。例如,如果執行緒1鎖住了a,然後嘗試對b進行加鎖,同時執行緒2已經鎖住了b,接著嘗試對a進行加鎖,這時死鎖就發生了。執行緒1永遠得不到b,執行緒2也永遠得不到a,並且它們...

16 Java併發性和多執行緒 死鎖

以下內容 死鎖是兩個或更多執行緒阻塞著等待其它處於死鎖狀態的執行緒所持有的鎖。死鎖通常發生在多個執行緒同時但以不同的順序請求同一組鎖的時候。例如,如果執行緒1鎖住了a,然後嘗試對b進行加鎖,同時執行緒2已經鎖住了b,接著嘗試對a進行加鎖,這時死鎖就發生了。執行緒1永遠得不到b,執行緒2也永遠得不到a...

多執行緒 Java多執行緒與併發

實現的方式主要有三種 執行緒的狀態 基本差別 最主要的本質區別 兩個概念 鎖池 假設執行緒a已經擁有了某個物件 不是類 的鎖,而其他執行緒b c想要呼叫這個物件的某個synchronized方法 或者塊 由於b c執行緒在進入物件的synchronized方法 或者塊 之前必須先獲得該物件鎖的擁有權...