最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

java 中modCount 詳解及源碼分析

 更新時間:2017年02月04日 10:53:15   作者:魏福成  
這篇文章主要介紹了java 中modCount 詳解及源碼分析的相關資料,需要的朋友可以參考下

modCount到底是干什么的呢

在ArrayList,LinkedList,HashMap等等的內(nèi)部實現(xiàn)增,刪,改中我們總能看到modCount的身影,modCount字面意思就是修改次數(shù),但為什么要記錄modCount的修改次數(shù)呢?

大家發(fā)現(xiàn)一個公共特點沒有,所有使用modCount屬性的全是線程不安全的,這是為什么呢?說明這個玩意肯定和線程安全有關系嘍,那有什么關系呢

閱讀源碼,發(fā)現(xiàn)這玩意只有在本數(shù)據(jù)結構對應迭代器中才使用,以HashMap為例:

private abstract class HashIterator<E> implements Iterator<E> {
    Entry<K,V> next;    // next entry to return
    int expectedModCount;  // For fast-fail
    int index;       // current slot
    Entry<K,V> current;   // current entry

    HashIterator() {
      expectedModCount = modCount;
      if (size > 0) { // advance to first entry
        Entry[] t = table;
        while (index < t.length && (next = t[index++]) == null)
          ;
      }
    }

    public final boolean hasNext() {
      return next != null;
    }

    final Entry<K,V> nextEntry() {
      if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
      Entry<K,V> e = next;
      if (e == null)
        throw new NoSuchElementException();

      if ((next = e.next) == null) {
        Entry[] t = table;
        while (index < t.length && (next = t[index++]) == null)
          ;
      }
      current = e;
      return e;
    }

    public void remove() {
      if (current == null)
        throw new IllegalStateException();
      if (modCount != expectedModCount)
        throw new ConcurrentModificationException();
      Object k = current.key;
      current = null;
      HashMap.this.removeEntryForKey(k);
      expectedModCount = modCount;
    }
  }

由以上代碼可以看出,在一個迭代器初始的時候會賦予它調(diào)用這個迭代器的對象的mCount,如何在迭代器遍歷的過程中,一旦發(fā)現(xiàn)這個對象的mcount和迭代器中存儲的mcount不一樣那就拋異常

好的,下面是這個的完整解釋

Fail-Fast 機制

我們知道 java.util.HashMap 不是線程安全的,因此如果在使用迭代器的過程中有其他線程修改了map,那么將拋出ConcurrentModificationException,這就是所謂fail-fast策略。這一策略在源碼中的實現(xiàn)是通過 modCount 域,modCount 顧名思義就是修改次數(shù),對HashMap 內(nèi)容的修改都將增加這個值,那么在迭代器初始化過程中會將這個值賦給迭代器的 expectedModCount。在迭代過程中,判斷 modCount 跟 expectedModCount 是否相等,如果不相等就表示已經(jīng)有其他線程修改了 Map:注意到 modCount 聲明為 volatile,保證線程之間修改的可見性。

所以在這里和大家建議,當大家遍歷那些非線程安全的數(shù)據(jù)結構時,盡量使用迭代器

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • java使用BeanUtils.copyProperties踩坑經(jīng)歷

    java使用BeanUtils.copyProperties踩坑經(jīng)歷

    最近在做個項目,踩了個坑特此記錄一下,本文主要介紹了使用BeanUtils.copyProperties踩坑經(jīng)歷,需要的朋友們下面隨著小編來一起學習學習吧
    2021-05-05
  • 導出maven項目依賴的jar包(圖文教程)

    導出maven項目依賴的jar包(圖文教程)

    下面小編就為大家?guī)硪黄獙С鰉aven項目依賴的jar包(圖文教程)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

    flyway實現(xiàn)java 自動升級SQL腳本的問題及解決方法

    大家在平時開發(fā)自己寫SQL語句忘記在所有環(huán)境執(zhí)行,需要新增環(huán)境做數(shù)據(jù)遷移,那么遇到這樣的問題該如何解決呢?本文通過場景分析給大家介紹java 自動升級SQL腳本的策略,感興趣的朋友一起看看吧
    2021-07-07
  • java?啟動參數(shù)?springboot?idea詳解

    java?啟動參數(shù)?springboot?idea詳解

    這篇文章主要介紹了java?啟動參數(shù)?springboot?idea的相關知識,本文通過實例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-09-09
  • SpringMVC中的DispatcherServlet請求分析

    SpringMVC中的DispatcherServlet請求分析

    這篇文章主要介紹了SpringMVC中的DispatcherServlet請求分析, DispatcherServlet作為一個Servlet,那么當有請求到Tomcat等Servlet服務器時,會調(diào)用其service方法,再調(diào)用到其父類GenericServlet的service方法,需要的朋友可以參考下
    2024-01-01
  • SpringCloud中的斷路器(Hystrix)和斷路器監(jiān)控(Dashboard)

    SpringCloud中的斷路器(Hystrix)和斷路器監(jiān)控(Dashboard)

    本篇主要介紹的是SpringCloud中的斷路器(Hystrix)和斷路器指標看板(Dashboard)的相關使用知識,需要的朋友可以參考下
    2019-06-06
  • Java Big Number操作BigInteger及BigDecimal類詳解

    Java Big Number操作BigInteger及BigDecimal類詳解

    這篇文章主要為大家介紹了Java Big Number操作BigInteger及BigDecimal類詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-07-07
  • 基于Java制作一個燈謎猜猜樂游戲

    基于Java制作一個燈謎猜猜樂游戲

    中秋佳節(jié),是我國傳統(tǒng)的重大節(jié)日之一,全國各地為了增強過節(jié)的氣氛,都有許多傳統(tǒng)的中秋活動,比如猜燈謎,所以本文就來用Java制作一個燈謎猜猜樂游戲,感興趣的可以了解下
    2023-09-09
  • Springboot整合kafka的示例代碼

    Springboot整合kafka的示例代碼

    這篇文章主要介紹了Springboot整合kafka的示例代碼,本文通過示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-02-02
  • Java cglib動態(tài)代理原理分析

    Java cglib動態(tài)代理原理分析

    這篇文章主要介紹了Java cglib動態(tài)代理的相關資料,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下
    2021-05-05

最新評論

宜川县| 项城市| 天全县| 庄河市| 东阳市| 马山县| 温州市| 政和县| 白山市| 油尖旺区| 乐陵市| 永城市| 余干县| 化德县| 河源市| 长白| 南陵县| 伽师县| 东宁县| 马山县| 静宁县| 山西省| 和政县| 姚安县| 康马县| 宁城县| 根河市| 朝阳县| 灵寿县| 晋州市| 囊谦县| 从化市| 桐城市| 灵寿县| 措勤县| 武定县| 安西县| 沂水县| 增城市| 土默特左旗| 静安区|