日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

fail-safe fail-fast知多少

發(fā)布時間:2024/2/28 编程问答 39 豆豆
生活随笔 收集整理的這篇文章主要介紹了 fail-safe fail-fast知多少 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

  • 簡介
  • Fail-fast Iterator
  • Fail-fast 的原理
  • Fail-safe Iterator
  • 總結(jié)

fail-safe fail-fast知多少

簡介

我們在使用集合類的時候,通常會需要去遍歷集合中的元素,并在遍歷中對其中的元素進行處理。這時候我們就要用到Iterator,經(jīng)常寫程序的朋友應(yīng)該都知道,在Iterator遍歷的過程中,是不能夠修改集合數(shù)據(jù)的,否則就會拋出ConcurrentModificationException。

因為ConcurrentModificationException的存在,就把Iterator分成了兩類,Fail-fast和Fail-safe。

Fail-fast Iterator

Fail-fast看名字就知道它的意思是失敗的非常快。就是說如果在遍歷的過程中修改了集合的結(jié)構(gòu),則就會立刻報錯。

Fail-fast通常在下面兩種情況下拋出ConcurrentModificationException:

  • 單線程的環(huán)境中
  • 如果在單線程的環(huán)境中,iterator創(chuàng)建之后,如果不是通過iterator自身的remove方法,而是通過調(diào)用其他的方法修改了集合的結(jié)構(gòu),則會報錯。

  • 多線程的環(huán)境中
  • 如果一個線程中創(chuàng)建了iterator,而在另外一個線程中修改了集合的結(jié)構(gòu),則會報錯。

    我們先看一個Fail-fast的例子:

    Map<Integer,String> users = new HashMap<>();users.put(1, "jack");users.put(2, "alice");users.put(3, "jone");Iterator iterator1 = users.keySet().iterator();//not modify key, so no exceptionwhile (iterator1.hasNext()){log.info("{}",users.get(iterator1.next()));users.put(2, "mark");}

    上面的例子中,我們構(gòu)建了一個Map,然后遍歷該map的key,在遍歷過程中,我們修改了map的value。

    運行發(fā)現(xiàn),程序完美執(zhí)行,并沒有報任何異常。

    這是因為我們遍歷的是map的key,只要map的key沒有被手動修改,就沒有問題。

    再看一個例子:

    Map<Integer,String> users = new HashMap<>();users.put(1, "jack");users.put(2, "alice");users.put(3, "jone");Iterator iterator1 = users.keySet().iterator();Iterator iterator2 = users.keySet().iterator();//modify key,get exceptionwhile (iterator2.hasNext()){log.info("{}",users.get(iterator2.next()));users.put(4, "mark");}

    上面的例子中,我們在遍歷map的key的同時,對key進行了修改。這種情況下就會報錯。

    Fail-fast 的原理

    為什么修改了集合的結(jié)構(gòu)就會報異常呢?

    我們以ArrayList為例,來講解下Fail-fast 的原理。

    在AbstractList中,定義了一個modCount變量:

    protected transient int modCount = 0;

    在遍歷的過程中都會去調(diào)用checkForComodification()方法來對modCount進行檢測:

    public E next() {checkForComodification();try {int i = cursor;E next = get(i);lastRet = i;cursor = i + 1;return next;} catch (IndexOutOfBoundsException e) {checkForComodification();throw new NoSuchElementException();}}

    如果檢測的結(jié)果不是所預(yù)期的,就會報錯:

    final void checkForComodification() {if (modCount != expectedModCount)throw new ConcurrentModificationException();}

    在創(chuàng)建Iterator的時候會復(fù)制當前的modCount進行比較,而這個modCount在每次集合修改的時候都會進行變動,最終導(dǎo)致Iterator中的modCount和現(xiàn)有的modCount是不一致的。

    public void set(E e) {if (lastRet < 0)throw new IllegalStateException();checkForComodification();try {AbstractList.this.set(lastRet, e);expectedModCount = modCount;} catch (IndexOutOfBoundsException ex) {throw new ConcurrentModificationException();}}

    注意,Fail-fast并不保證所有的修改都會報錯,我們不能夠依賴ConcurrentModificationException來判斷遍歷中集合是否被修改。

    Fail-safe Iterator

    我們再來講一下Fail-safe,Fail-safe的意思是在遍歷的過程中,如果對集合進行修改是不會報錯的。

    Concurrent包下面的類型都是Fail-safe的。看一個ConcurrentHashMap的例子:

    Map<Integer,String> users = new ConcurrentHashMap<>();users.put(1, "jack");users.put(2, "alice");users.put(3, "jone");Iterator iterator1 = users.keySet().iterator();//not modify key, so no exceptionwhile (iterator1.hasNext()){log.info("{}",users.get(iterator1.next()));users.put(2, "mark");}Iterator iterator2 = users.keySet().iterator();//modify key,get exceptionwhile (iterator2.hasNext()){log.info("{}",users.get(iterator2.next()));users.put(4, "mark");}

    上面的例子完美執(zhí)行,不會報錯。

    總結(jié)

    Fail-fast 和 Fail-safe 是集合遍歷的重要概念,希望大家能夠掌握。

    本文的例子 https://github.com/ddean2009/learn-java-streams

    更多精彩內(nèi)容且看:

    • 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級賬本,以太坊,Libra,比特幣等持續(xù)更新
    • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續(xù)更新
    • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續(xù)更新
    • java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細文章教程

    歡迎關(guān)注我的公眾號:程序那些事,更多精彩等著您!
    更多內(nèi)容請訪問 www.flydean.com

    總結(jié)

    以上是生活随笔為你收集整理的fail-safe fail-fast知多少的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 日本一级片在线播放 | 中文字幕三级 | 91网址入口 | 久久毛片视频 | 欧美激情视频一区二区 | 手机看片日韩 | 五月天国产在线 | 亚洲视频免费观看 | 国产精品成人电影在线观看 | 欧美性猛交富婆 | 搞黄视频在线观看 | 免费看污片的网站 | 日本国产精品视频 | 秋霞电影一区二区 | 久久久久久黄色 | 国产伦精品一区二区三区在线观看 | 毛片官网 | 色婷婷五| 在线成人看片 | 国产一区二区三区久久久 | 亚洲欧美一区二区三区不卡 | 男人添女人荫蒂国产 | 欧美性生交片4 | a级无遮挡超级高清-在线观看 | 能看毛片的网站 | 色婷婷狠狠 | 国产馆视频 | av解说在线观看 | 色综合婷婷 | 国产黄色一级片视频 | 一区二区三区四区精品 | 中文字幕免费在线观看 | 加勒比一区二区三区 | 亚州av综合色区无码一区 | 五月婷六月 | 在线免费黄色 | 337p粉嫩色噜噜噜大肥臀 | 一区二区成人精品 | av免费播放 | 91手机视频| 天海翼av| 欧美日韩亚洲综合 | 午夜理伦三级做爰电影 | 日韩av首页 | 黄色美女一级片 | 一二三区精品视频 | 亚洲av综合永久无码精品天堂 | 黄色网址最新 | 国产chinasex麻豆videos | 国产片网站 | 中出在线| av成人免费在线观看 | 男女超碰 | 97国产成人 | 国产激情视频在线 | 日本韩国欧美一区 | 在线观看视频福利 | 日韩一区二区视频 | 波多野结衣高清在线 | 97香蕉超级碰碰久久免费软件 | 天天天天天天天天干 | 免费在线观看av网址 | 国产一区二区三区小说 | 精品无码久久久久久久久 | 亚洲av无码一区二区三区在线播放 | 黄色网在线免费观看 | av在线第一页 | 亚洲理论电影在线观看 | 久久久久久网站 | 经典杯子蛋糕日剧在线观看免费 | 日韩精品一区在线视频 | av中文一区 | 国内精品偷拍 | 一本久道久久 | 久久不射视频 | 免费无码肉片在线观看 | 欲色av| 九九九免费| 粉嫩av一区二区三区免费观看 | 三级影片在线免费观看 | 亚洲精品一区二区三区在线观看 | 中国1级毛片 | 国产伦精品一区二区三区免.费 | 久久久久亚洲AV成人无码国产 | 狠狠撸在线 | 国产一区2 | 精品96久久久久久中文字幕无 | 色一情一交一乱一区二区三区 | 男人疯狂高潮呻吟视频 | 日日干日日插 | 黄色精品 | 自拍偷拍第 | 麻豆传谋在线观看免费mv | 日韩一区二区三区在线观看视频 | 中国人与拘一级毛片 | 国产做爰xxxⅹ久久久精华液 | 色综合久久av | 女同爱爱视频 | 色av中文字幕 |