六、效能問題
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 ...