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

Java源碼解析ConcurrentHashMap的初始化

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

首先看一下代碼

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)初始化了。如果沒有,則嘗試進(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è)過程,直到獲得到鎖為止。讓出CPU的動(dòng)作,是通過java中的Thread.yield()來實(shí)現(xiàn)的。在學(xué)校學(xué)習(xí)java的時(shí)候曾經(jīng)接觸過線程的這個(gè)方法,但當(dāng)時(shí)不明白什么場景下會(huì)用到。原來,Thread.yield()方法可以用來實(shí)現(xiàn)自旋鎖。

這里,可以提出一個(gè)問題,自選鎖方式和死循環(huán)方式來判斷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é)

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

相關(guān)文章

  • 工作中Java集合的規(guī)范使用操作詳解

    工作中Java集合的規(guī)范使用操作詳解

    這篇文章主要為大家詳細(xì)介紹了工作中Java集合使用時(shí)需要注意的規(guī)范,文中的示例代碼講解詳細(xì),對我們使用Java集合有一定的幫助,感興趣的可以了解一下
    2022-11-11
  • Java雜談之代碼重構(gòu)的方法多長才算長

    Java雜談之代碼重構(gòu)的方法多長才算長

    關(guān)于代碼重構(gòu)的理解:在不改變軟件系統(tǒng)/模塊所具備的功能特性的前提下,遵循/利用某種規(guī)則,使其內(nèi)部結(jié)構(gòu)趨于完善。其在軟件生命周期中的價(jià)值體現(xiàn)主要在于可維護(hù)性和可擴(kuò)展性
    2021-10-10
  • 基于feign傳參MultipartFile問題解決

    基于feign傳參MultipartFile問題解決

    這篇文章主要介紹了基于feign傳參MultipartFile問題解決,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-03-03
  • SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本)

    SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本)

    這篇文章主要介紹了SpringCloud Finchley+Spring Boot 2.0 集成Consul的方法示例(1.2版本),小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-08-08
  • Maven之分析剔除無用的jar引用問題

    Maven之分析剔除無用的jar引用問題

    這篇文章主要介紹了Maven之分析剔除無用的jar引用問題,具有很好的參考價(jià)值,希望對大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • 解決java連接虛擬機(jī)Hbase無反應(yīng)的問題

    解決java連接虛擬機(jī)Hbase無反應(yīng)的問題

    這篇文章主要介紹了解決java連接虛擬機(jī)Hbase無反應(yīng)的問題,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • java 輸入一個(gè)數(shù)字,反轉(zhuǎn)輸出這個(gè)數(shù)字的值(實(shí)現(xiàn)方法)

    java 輸入一個(gè)數(shù)字,反轉(zhuǎn)輸出這個(gè)數(shù)字的值(實(shí)現(xiàn)方法)

    下面小編就為大家?guī)硪黄猨ava 輸入一個(gè)數(shù)字,反轉(zhuǎn)輸出這個(gè)數(shù)字的值(實(shí)現(xiàn)方法)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2016-10-10
  • Python連接Java Socket服務(wù)端的實(shí)現(xiàn)方法

    Python連接Java Socket服務(wù)端的實(shí)現(xiàn)方法

    這篇文章主要介紹了Python連接Java Socket服務(wù)端的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • SpringBoot中的異常處理與參數(shù)校驗(yàn)的方法實(shí)現(xiàn)

    SpringBoot中的異常處理與參數(shù)校驗(yàn)的方法實(shí)現(xiàn)

    這篇文章主要介紹了SpringBoot中的異常處理與參數(shù)校驗(yàn)的方法實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-04-04
  • Shiro的運(yùn)行大致流程詳解

    Shiro的運(yùn)行大致流程詳解

    這篇文章主要介紹了Shiro的運(yùn)行大致流程詳解,Shiro和SpringSecurity都是Java領(lǐng)域中常用的安全框架,它們都提供了身份認(rèn)證和授權(quán)功能,可以幫助開發(fā)者快速構(gòu)建安全的應(yīng)用程序,需要的朋友可以參考下
    2023-07-07

最新評論