併發程式設計筆記六 效能問題

2021-10-04 05:33:34 字數 1494 閱讀 1331

六、效能問題

6.1、效能

在一定的配置下,如果乙個程式的執行時間越短,吞吐量越大,我們就說這個程式的效能越好。

現代計算機的cpu核數越來越多,cpu執行速度越來越快,多執行緒的程式可以充分利用多核cpu的效能,提高cpu處理器的利用率。所以,大部分情況下多執行緒能提高程式的效能。但是如果引入執行緒的開銷和同步**塊對效能的影響大於處理器的利用率,程式的效能是降低的。

6.2、多執行緒的開銷和同步**塊對效能的影響

多執行緒的開銷和同步**塊對效能的影響主要有上下文切換重新整理快取記憶體阻塞操作

6.2.1、上下文切換

cpu執行執行緒**時,會分配給這段執行緒一段時間片去執行**。當時間片到達或者遇到阻塞操作或者執行緒主動放棄時間片,執行緒都會退出執行狀態,這時cpu就需要切換執行緒的上下文了

上下文切換主要要做以下兩件事:

(2)執行緒首次載入到cpu中時,會載入快取資料到快取記憶體中

6.2.2、重新整理快取記憶體

當我們使用volatile時,會導致cpu快取記憶體失效,強制將快取記憶體中的資料重新整理到主記憶體中,載入資料也是先從主記憶體中載入到快取記憶體上再使用;

同時使用synchronized或者volatile時,會抑制指令重排序,引起效能損耗。

6.2.3、阻塞操作

當乙個執行緒遇到比如io的阻塞操作或者獲取不到鎖而阻塞或者呼叫sleep等方法而等待,就會影響到整個系統的效能,主要包括:

(1)阻塞或等待的執行緒會放棄時間片,引起上下文切換;

(2)掛起執行緒(長時間阻塞)會被臨時放入硬碟上;

(3)如果阻塞的執行緒持有鎖,那麼其他需要獲取這個鎖的執行緒將會無法繼續執行。

6.3、效能調優的手段

效能調優的手段主要有減少鎖的競爭、減小鎖的粒度、減少使用synchronized關鍵字

(1)減少鎖的競爭

減少鎖的競爭主要是減少每次持有鎖的時間和降低鎖的請求頻率,所以在同步**塊中的**盡量不要有比較耗時的操作。

讀寫鎖也是一種減少鎖的競爭的方式,當對共享可變變數進行讀操作時不會相互阻塞,類似於資料庫的s鎖和x鎖。

(2)減小鎖的粒度

對於多個共享可變變數,如果他們之間不存在可變性條件的話,那麼不應該使用一把鎖來同步這些變數,每個變數都有自己的鎖,這樣就不會出現相互阻塞了。減小的鎖的粒度。

分段鎖就是減小鎖的粒度的一種方式,concurrenthashmap中就是利用了分段鎖來提高效能的。

(3)儘量減少使用synchronized關鍵字

能使用volatile的地方盡量不要使用synchronized關鍵字。

(4)使用cas非阻塞操作

java併發程式設計 六

併發工具類 lk最近學習了併發工具類的知識,總結一下它們的用法 1.countdownlatch 2.cyclicbarrier 3.semaphore 4.exchanger 使用完countdownlatch之後,覺得它適合應用於讓其它執行緒去各自執行完,然後main執行緒開始執行的場合 自己理...

併發程式設計學習筆記(六 執行緒組)

執行緒組其實就是執行緒的乙個集合,其中可以包含執行緒,也可以包含執行緒組,它和樹形結構非常相似。執行緒組可以有效的組織執行緒和執行緒組。父物件中有子物件,但不存在孫子物件。1 public class testthread implements runnable 9 catch interrupte...

併發程式設計筆記

public void somemethod public void somemethod public void method2 localobject localobject public class notthreadsafe notthreadsafe sharedinstance new ...