欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java源碼解析ConcurrentHashMap的初始化

 更新時(shí)間:2019年01月08日 11:50:45   作者:李燦輝  
今天小編就為大家分享一篇關(guān)于Java源碼解析ConcurrentHashMap的初始化,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧

首先看一下代碼

private final Node<K,V>[] initTable() {
    Node<K,V>[] tab; int sc;
    while ((tab = table) == null || tab.length == 0) { // 第一次檢查
      if ((sc = sizeCtl) < 0)
        Thread.yield(); // lost initialization race; just spin
      else if (U.compareAndSwapInt(this, SIZECTL, sc, -1)) {
        try {
          if ((tab = table) == null || tab.length == 0) {// 第二次檢查
            int n = (sc > 0) ? sc : DEFAULT_CAPACITY;
            @SuppressWarnings("unchecked")
            Node<K,V>[] nt = (Node<K,V>[])new Node<?,?>[n];
            table = tab = nt;
            sc = n - (n >>> 2);
          }
        } finally {
          sizeCtl = sc;
        }
        break;
      }
    }
    return tab;
  }

ConcurrentHashMap在初始化時(shí),如何進(jìn)行多線程間的同步?

ConcurrentHashMap在初始化時(shí),首先會(huì)判斷,哈希表是否已經(jīng)初始化了。如果沒(méi)有,則嘗試進(jìn)行初始化。

首先會(huì)判斷sizeCtl的值。sizeCtl是用于多線程之間同步的一個(gè)互斥變量。當(dāng)sizeCtl < 0時(shí),表示已經(jīng)有線程正在初始化哈希表或哈希表正在擴(kuò)容,此時(shí),不能再進(jìn)行操作。

此處sizeCtl其實(shí)是實(shí)現(xiàn)了自旋鎖的功能。自旋鎖,即,獲取鎖失敗時(shí),讓出CPU,稍后再進(jìn)行嘗試,重復(fù)這個(gè)過(guò)程,直到獲得到鎖為止。讓出CPU的動(dòng)作,是通過(guò)java中的Thread.yield()來(lái)實(shí)現(xiàn)的。在學(xué)校學(xué)習(xí)java的時(shí)候曾經(jīng)接觸過(guò)線程的這個(gè)方法,但當(dāng)時(shí)不明白什么場(chǎng)景下會(huì)用到。原來(lái),Thread.yield()方法可以用來(lái)實(shí)現(xiàn)自旋鎖。

這里,可以提出一個(gè)問(wèn)題,自選鎖方式和死循環(huán)方式來(lái)判斷sizeCtl的值,有什么不同?

當(dāng)然是效率的不同。死循環(huán)時(shí),程序會(huì)頻繁讀取sizeCtl的值,在滿足條件之前,會(huì)浪費(fèi)很多CPU周期。而自選鎖的效率更高,因?yàn)楫?dāng)它判斷sizeCtl不滿足條件時(shí),會(huì)主動(dòng)讓出CPU,此時(shí),當(dāng)前線程會(huì)處于ready狀態(tài),等待下一次被處理器選中并執(zhí)行的機(jī)會(huì)。在這段時(shí)間里,其他的線程得以利用CPU周期。所以,自旋鎖的效率更高。

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。如果你想了解更多相關(guān)內(nèi)容請(qǐng)查看下面相關(guān)鏈接

相關(guān)文章

  • SpringBoot整合Echarts實(shí)現(xiàn)用戶人數(shù)和性別展示功能(詳細(xì)步驟)

    SpringBoot整合Echarts實(shí)現(xiàn)用戶人數(shù)和性別展示功能(詳細(xì)步驟)

    這篇文章主要介紹了SpringBoot整合Echarts實(shí)現(xiàn)用戶人數(shù)和性別展示,通過(guò)數(shù)據(jù)庫(kù)設(shè)計(jì)、實(shí)現(xiàn)數(shù)據(jù)訪問(wèn)層、業(yè)務(wù)邏輯層和控制層的代碼編寫,以及前端頁(yè)面的開(kāi)發(fā),本文詳細(xì)地介紹了SpringBoot整合Echarts的實(shí)現(xiàn)步驟和代碼,需要的朋友可以參考下
    2023-05-05
  • 運(yùn)用java以及循環(huán)打印菱形詳細(xì)實(shí)例代碼

    運(yùn)用java以及循環(huán)打印菱形詳細(xì)實(shí)例代碼

    最近在看算法書的時(shí)候,看到有打印上三角的算法,然后要舉一反三,下面這篇文章主要介紹了運(yùn)用java以及循環(huán)打印菱形的相關(guān)資料,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-10-10
  • 淺談Arrays.asList()方法的使用

    淺談Arrays.asList()方法的使用

    本文主要介紹了Arrays.asList()方法的使用。具有很好的參考價(jià)值,下面跟著小編一起來(lái)看下吧
    2017-02-02
  • 淺析Java集合中的LinkedHashSet

    淺析Java集合中的LinkedHashSet

    這篇文章主要介紹了淺析Java集合中的LinkedHashSet,LinkedHashSet?是?Java?中的一個(gè)集合類,它是?HashSet?的子類,并實(shí)現(xiàn)了?Set?接口,與?HashSet?不同的是,LinkedHashSet?保留了元素插入的順序,并且具有?HashSet?的快速查找特性,需要的朋友可以參考下
    2023-09-09
  • Java中類的定義與實(shí)例化詳解

    Java中類的定義與實(shí)例化詳解

    這篇文章主要給大家介紹了關(guān)于Java中類的定義與實(shí)例化的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Java具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • java 基礎(chǔ)教程之多線程詳解及簡(jiǎn)單實(shí)例

    java 基礎(chǔ)教程之多線程詳解及簡(jiǎn)單實(shí)例

    這篇文章主要介紹了java 基礎(chǔ)教程之多線程詳解及簡(jiǎn)單實(shí)例的相關(guān)資料,線程的基本屬性、如何創(chuàng)建線程、線程的狀態(tài)切換以及線程通信,需要的朋友可以參考下
    2017-03-03
  • Java實(shí)現(xiàn)微信登錄并獲取用戶信息功能(開(kāi)發(fā)流程)

    Java實(shí)現(xiàn)微信登錄并獲取用戶信息功能(開(kāi)發(fā)流程)

    這篇文章主要介紹了Java實(shí)現(xiàn)微信登錄并獲取用戶信息功能(開(kāi)發(fā)流程),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2024-07-07
  • java利用Calendar類打印日歷

    java利用Calendar類打印日歷

    這篇文章主要為大家詳細(xì)介紹了java利用Calendar類打印日歷,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-07-07
  • java通過(guò)RESTful API實(shí)現(xiàn)兩個(gè)項(xiàng)目之間相互傳輸數(shù)據(jù)

    java通過(guò)RESTful API實(shí)現(xiàn)兩個(gè)項(xiàng)目之間相互傳輸數(shù)據(jù)

    一些特殊場(chǎng)景中,兩個(gè)項(xiàng)目發(fā)布在不同的服務(wù)器,并且由于服務(wù)器限制特殊情況ip無(wú)法相通時(shí)進(jìn)行開(kāi)放接口方式進(jìn)行數(shù)據(jù)傳輸,下面我們就來(lái)看看java通過(guò)RESTful API實(shí)現(xiàn)這一需求吧
    2025-09-09
  • 全面理解Java中的引用傳遞和值傳遞

    全面理解Java中的引用傳遞和值傳遞

    這篇文章主要介紹了全面理解Java中的引用傳遞和值傳遞,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2021-10-10

最新評(píng)論