国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

Java鎖優化

Bowman_han / 2152人閱讀

摘要:一般情況下,可以從兩個角度進行鎖優化對單個鎖算法的優化和對鎖粒度的細分。單個鎖的優化自旋鎖非自旋鎖在未獲取鎖的情況會被阻塞,之后再喚醒嘗試獲得鎖。

Java鎖優化

應用程序在并發環境下會產生很多問題,通常情況下,我們可以通過加鎖來解決多線程對臨界資源的訪問問題。但是加鎖往往會成為系統的瓶頸,因為加鎖和釋放鎖會涉及到與操作系統的交互,會有很大的性能問題。那么這個時候基于鎖的優化手段就顯得很重要了。

一般情況下,可以從兩個角度進行鎖優化:對單個鎖算法的優化和對鎖粒度的細分。

1. 單個鎖的優化 自旋鎖:

? 非自旋鎖在未獲取鎖的情況會被阻塞,之后再喚醒嘗試獲得鎖。而JDK的阻塞和喚醒是基于操作系統實現的,會有系統資源的開銷。自旋鎖就是線程不停地循環嘗試獲得鎖,而不會將自己阻塞,這樣不會浪費系統的資源開銷,但是會浪費CPU的資源。所有現在的JDK大部分都是先自旋等待,如果自旋等待一段時間之后還沒有獲取到鎖,就會將當前線程阻塞。

鎖消除:

? 當JVM分析代碼時發現某個方法只被單個線程安全訪問,而且這個方法是同步方法,那么JVM就會去掉這個方法的鎖。

單個鎖優化的瓶頸:

? 對單個鎖優化的效果就像提高單個CPU的處理能力一樣,最終會由于各個方面的限制而達到一個平衡點,到達這個點之后優化單個鎖的對高并發下面鎖的優化效果越來越低。所以將一個鎖進行粒度細分帶來的效果會很明顯,如果一個鎖保護的代碼塊被拆分成兩個鎖來保護,那么程序的效率就大約能夠提高到2倍,這個比單個鎖的優化帶來的效果要明顯很多。常見的鎖粒度細分技術有:鎖分解和鎖分段

2. 細分鎖粒度

細分鎖粒度的目的是降低競爭鎖的概率。

2.1 鎖分解

鎖分解的核心是將無關的代碼塊,如果在一個方法中有一部分的代碼與鎖無關,一部分的代碼與鎖有關,那么可以縮小這個鎖的返回,這樣鎖操作的代碼塊就會減少,鎖競爭的可能性也會減少

縮小鎖的范圍

縮小鎖的范圍是指盡量只在必要的地方加鎖,不要擴大加鎖的范圍,就拿單例模式舉例,范圍大的鎖可能將整個方法都加鎖了:

class Singleton {
  private Singleton instance;

  private Singleton() {
  }

  // 將整個方法加鎖
  public synchronized Singleton getInstance() {
    try {
      Thread.sleep(1000);  //do something
      if(null == instance)
        instance = new Singleton();
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    return instance;
  }

}

優化后的,只將部分代碼加鎖:

class Singleton {
  private Singleton instance;

  private Singleton() {
  }

  public Singleton getInstance() {
    try {
      Thread.sleep(1000);  //do something
      // 只對部分代碼加鎖
      synchronized(this) {
        if(null == instance)
          instance = new Singleton();
      }
    } catch (InterruptedException e) {
      e.printStackTrace();
    }

    return instance;
  }
}
減少鎖的粒度

減少鎖的粒度是指如果一個鎖需要保護多個相互獨立的變量,那么可以將一個鎖分解為多個鎖,并且每個鎖保護一個變量,這樣就可以減少鎖沖突。看一下下面的例子:

class Demo{
  private Set allUsers = new HashSet();
  private Set allComputers = new HashSet();

  //公用一把鎖
  public synchronized void addUser(String user){ 
    allUsers.add(user);
  }
  
  public synchronized void addComputer(String computer){
    allComputers.add(computer);
  }
}

縮小鎖的粒度后,將一個鎖拆分為多個:

class Demo{
  private Set allUsers = new HashSet();
  private Set allComputers = new HashSet();
  
  //分解為兩把鎖
  public void addUser(String user){ 
    synchronized (allUsers){
      allUsers.add(user);
    }
  }
  
  public void addComputer(String computer){
    synchronized (allComputers){
      allComputers.add(computer);
    }
  }
}

如上的方法把一個鎖分解為2個鎖時候,采用兩個線程時候,大約能夠使程序的效率提升一倍。

2.2 鎖分段

鎖分段和縮小鎖的粒度類似,就是將鎖細分的粒度更多,比如將一個數組的每個位置當做多帶帶的鎖。JDK8以前ConcurrentHashMap就使用了鎖分段技術,它將散列數組分成多個Segment,每個Segment存儲了實際的數據,訪問數據的時候只需要對數據所在的Segment加鎖就行。

參考:

Java鎖分解鎖分段技術: http://guochenglai.com/2016/0...

ConcurrentHashMap的鎖分段技術:https://blog.csdn.net/yansong...

文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。

轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69626.html

相關文章

  • Java 虛擬機對優化所做的努力

    摘要:自選鎖鎖膨脹后,虛擬機為了避免線程真實地在操作系統層面掛起,虛擬機還會在做最后的努力自選鎖。 showImg(https://segmentfault.com/img/remote/1460000016159660?w=500&h=333); 作為一款公用平臺,JDK 本身也為并發程序的性能絞盡腦汁,在 JDK 內部也想盡一切辦法提供并發時的系統吞吐量。這里,我將向大家簡單介紹幾種 J...

    ralap 評論0 收藏0
  • 值得保存的 synchronized 關鍵字總結

    摘要:無論是互斥鎖,還是自旋鎖,在任何時刻,最多只能有一個保持者,也就說,在任何時刻最多只能有一個執行單元獲得鎖。另外在中引入了自適應的自旋鎖。和關鍵字的總結推薦一 該文已加入開源文檔:JavaGuide(一份涵蓋大部分Java程序員所需要掌握的核心知識)。地址:https://github.com/Snailclimb... 本文是對 synchronized 關鍵字使用、底層原理、JD...

    miguel.jiang 評論0 收藏0
  • Synchronized 關鍵字使用、底層原理、JDK1.6 之后的底層優化以及 和ReenTran

    摘要:使用可以禁止的指令重排,保證在多線程環境下也能正常運行。關鍵字底層原理總結關鍵字底層原理屬于層面。另外在中引入了自適應的自旋鎖。自適應的自旋鎖帶來的改進就是自旋的時間不在固定了,而是和前一次同一個鎖上的自旋時間以及鎖的擁有者 【強烈推薦!非廣告!】阿里云雙11褥羊毛活動:https://m.aliyun.com/act/team1111/#/share?params=N.FF7yxCc...

    Vixb 評論0 收藏0
  • java優化策略

    摘要:前置知識點對象頭要了解鎖優化策略中的輕量級鎖與偏向鎖的原理和運作過程,需要先了解虛擬機的對象頭部分的內存布局。否則說明這個鎖對象已經被其他線程搶占了。 前置知識點:對象頭 要了解鎖優化策略中的輕量級鎖與偏向鎖的原理和運作過程,需要先了解Hotspot虛擬機的對象頭部分的內存布局。 對象頭(摘自《深入理解java虛擬機》) 對象頭信息是與對象自身定義的數據無關的額外存儲成本 如果對象是數...

    warkiz 評論0 收藏0
  • 淺談java中的并發控制

    摘要:并發需要解決的問題功能性問題線程同步面臨兩個問題,想象下有兩個線程在協作工作完成某項任務。鎖可用于規定一個臨界區,同一時間臨界區內僅能由一個線程訪問。并發的數據結構線程安全的容器,如等。 并發指在宏觀上的同一時間內同時執行多個任務。為了滿足這一需求,現代的操作系統都抽象出 線程 的概念,供上層應用使用。 這篇博文不打算詳細展開分析,而是對java并發中的概念和工具做一個梳理。沿著并發模...

    Gilbertat 評論0 收藏0

發表評論

0條評論

Bowman_han

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<