多線程性能調優(二)--上下文切換

           在多線程編程中,爲了保證數據的原子性,我們會使用到鎖,那麼在高併發場景,由於多個線程競爭鎖,就產生了上下文切換(Context Switch),而頻繁的上下文切換是非常耗資源的,這是造成性能低下的主要原因。

          那麼到底什麼是上下文切換?什麼情況下發生上下文切換?如何減少上下文切換呢?我們圍繞這三問展開探討。

【什麼是上下文切換】

        一個線程被暫停剝奪使用權(cpu時間片用完),另外一個線程被選中開始或者繼續運行的過程就叫做上下文切換(Context Switch)

【什麼情況下發生上下文切換】

      程序本身觸發的切換,我們稱這種爲自發性上下文切換,比如調用sleep()、wait()、yield9、join()等方法時,還有加鎖時,Synchronized和lock鎖,都屬於自發性上下文切換。

    另一種是由系統或者虛擬機誘發的非自發性上下文切換。比如JVM的垃圾回收機制就屬於這種。

 

【如何減少上下文切換】 

    【鎖競爭優化】 

             1、減少鎖的持有時間。比如加鎖代碼塊除去無關業務,只保留核心業務。

             2、降低鎖粒度。鎖分離(RRW讀寫鎖)和鎖分段(ConcurrentHashMap就是採用鎖分段)

             3、樂觀鎖代替悲觀鎖。

   【wait/notify優化】

         1、用Obejct.notify()代替Object.notifyAll()。因爲前者喚醒指定線程,後者喚醒所有線程

          2、利用利用Lock鎖的Condition接口替代Synchronized內部鎖的Object.wait()/notify

【設置合理的線程池大小,避免創建過多的線程】

【減少java虛擬機的垃圾回收】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章