您的位置 首页 > 德语词汇

fail safe是什么意思、读音 fail-safe fail-fast知多少

大家好,关于fail safe是什么意思、读音很多朋友都还不太明白,不过没关系,因为今天小编就来为大家分享关于fail-safe fail-fast知多少的知识点,相信应该可以解决大家的一些困惑和问题,如果碰巧可以解决您的问题,还望关注下本站哦,希望对各位有所帮助!

fail safe是什么意思、读音 fail-safe fail-fast知多少

我们在使用集合类的时候,通常会需要去遍历集合中的元素,并在遍历中对其中的元素进行处理。这时候我们就要用到Iterator,经常写程序的朋友应该都知道,在Iterator遍历的过程中,是不能够修改集合数据的,否则就会抛出ConcurrentModificationException。

因为ConcurrentModificationException的存在,就把Iterator分成了两类,Fail-fast和Fail-safe。

Fail-fast看名字就知道它的意思是失败的非常快。就是说如果在遍历的过程中修改了集合的结构,则就会立刻报错。

Fail-fast通常在下面两种情况下抛出ConcurrentModificationException:

如果在单线程的环境中,iterator创建之后,如果不是通过iterator自身的remove方法,而是通过调用其他的方法修改了集合的结构,则会报错。

如果一个线程中创建了iterator,而在另外一个线程中修改了集合的结构,则会报错。

Map<Integer,String>users=newHashMap<>();\n\nusers.put(1,"jack");\nusers.put(2,"alice");\nusers.put(3,"jone");\n\nIteratoriterator1=users.keySet().iterator();\n\n//notmodifykey,sonoexception\nwhile(iterator1.hasNext())\n{\nlog.info("{}",users.get(iterator1.next()));\nusers.put(2,"mark");\n}\n

上面的例子中,我们构建了一个Map,然后遍历该map的key,在遍历过程中,我们修改了map的value。

运行发现,程序完美执行,并没有报任何异常。

这是因为我们遍历的是map的key,只要map的key没有被手动修改,就没有问题。

Map<Integer,String>users=newHashMap<>();\n\nusers.put(1,"jack");\nusers.put(2,"alice");\nusers.put(3,"jone");\n\nIteratoriterator1=users.keySet().iterator();\n\nIteratoriterator2=users.keySet().iterator();\n//modifykey,getexception\nwhile(iterator2.hasNext())\n{\nlog.info("{}",users.get(iterator2.next()));\nusers.put(4,"mark");\n}\n

上面的例子中,我们在遍历map的key的同时,对key进行了修改。这种情况下就会报错。

为什么修改了集合的结构就会报异常呢?

我们以ArrayList为例,来讲解下Fail-fast的原理。

在AbstractList中,定义了一个modCount变量:

protectedtransientintmodCount=0;\n

在遍历的过程中都会去调用checkForComodification()方法来对modCount进行检测:

publicEnext(){\ncheckForComodification();\ntry{\ninti=cursor;\nEnext=get(i);\nlastRet=i;\ncursor=i+1;\nreturnnext;\n}catch(IndexOutOfBoundsExceptione){\ncheckForComodification();\nthrownewNoSuchElementException();\n}\n}\n

如果检测的结果不是所预期的,就会报错:

finalvoidcheckForComodification(){\nif(modCount!=expectedModCount)\nthrownewConcurrentModificationException();\n}\n

在创建Iterator的时候会复制当前的modCount进行比较,而这个modCount在每次集合修改的时候都会进行变动,最终导致Iterator中的modCount和现有的modCount是不一致的。

publicvoidset(Ee){\nif(lastRet<0)\nthrownewIllegalStateException();\ncheckForComodification();\n\ntry{\nAbstractList.this.set(lastRet,e);\nexpectedModCount=modCount;\n}catch(IndexOutOfBoundsExceptionex){\nthrownewConcurrentModificationException();\n}\n}\n

注意,Fail-fast并不保证所有的修改都会报错,我们不能够依赖ConcurrentModificationException来判断遍历中集合是否被修改。

我们再来讲一下Fail-safe,Fail-safe的意思是在遍历的过程中,如果对集合进行修改是不会报错的。

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

Map<Integer,String>users=newConcurrentHashMap<>();\n\nusers.put(1,"jack");\nusers.put(2,"alice");\nusers.put(3,"jone");\n\nIteratoriterator1=users.keySet().iterator();\n\n//notmodifykey,sonoexception\nwhile(iterator1.hasNext())\n{\nlog.info("{}",users.get(iterator1.next()));\nusers.put(2,"mark");\n}\n\nIteratoriterator2=users.keySet().iterator();\n//modifykey,getexception\nwhile(iterator2.hasNext())\n{\nlog.info("{}",users.get(iterator2.next()));\nusers.put(4,"mark");\n}\n

上面的例子完美执行,不会报错。

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

欢迎关注我的公众号:程序那些事,更多精彩等着您!

fail safe是什么意思、读音的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于fail-safe fail-fast知多少、fail safe是什么意思、读音的信息别忘了在本站进行查找哦。

本站涵盖的内容、图片、视频等数据,部分未能与原作者取得联系。若涉及版权问题,请及时通知我们并提供相关证明材料,我们将及时予以删除!谢谢大家的理解与支持!

Copyright © 2023