字節(jié)面試,問到的一個(gè)小知識(shí)點(diǎn),這里做一下總結(jié),其實(shí)小編之前有一篇文章,已經(jīng)對(duì)此有過涉及,不過這里知識(shí)專項(xiàng)針對(duì)于問題,把這個(gè)知識(shí)點(diǎn)拎出來說一下。
1.問題
什么是Fail-fast機(jī)制?
Hashmap是否擁有Fail-fast機(jī)制?
ConcurrentModificationException異常原因和解決方法是什么?
哪些你常用的數(shù)據(jù)結(jié)構(gòu)是Fail-fast的,哪些不是?舉例說明一下
Enumeration與Iterator的異同?
2.探索、解答
2.1 Fail-fast機(jī)制
從字面意思,很好理解,就是快速失敗機(jī)制。映射到j(luò)ava設(shè)計(jì)中,fail-fast 機(jī)制是java集合(Collection)中的一種錯(cuò)誤機(jī)制。當(dāng)多個(gè)線程對(duì)同一個(gè)集合的內(nèi)容進(jìn)行操作時(shí),就可能會(huì)產(chǎn)生fail-fast事件。例如:當(dāng)某一個(gè)線程A通過iterator去遍歷某集合的過程中,若該集合的內(nèi)容被其他線程所改變了;那么線程A訪問集合時(shí),就會(huì)拋出ConcurrentModificationException
異常,產(chǎn)生fail-fast事件。
2.2 ConcurrentModificationException
List在for、while正常遍歷過程中,如果remove元素,容易出現(xiàn)ConcurrentModificationException 異常,根本原因的話,之前ArrayList源碼分析文章已經(jīng)講過,各位有興趣可以移步閱讀。
ConcurrentModificationException發(fā)生是因?yàn)槲覀冊(cè)谑褂玫鞅闅vList的同時(shí),還使用了List相應(yīng)的remove、add進(jìn)行元素增加或刪除,導(dǎo)致不一。
2.3 Enumeration與Iterator的異同
2.3.1 Iterator
java中迭代器接口的源碼很簡單,我們看下面
package java.util;
import java.util.function.Consumer;
public interface Iterator<E> {
boolean hasNext();
E next();
default void remove() {
throw new UnsupportedOperationException("remove");
}
default void forEachRemaining(Consumer<? super E> action) {
Objects.requireNonNull(action);
while (hasNext())
action.accept(next());
}
}
就是遍歷、移除的接口定義,這塊知識(shí)我們?cè)贏ndroid源碼設(shè)計(jì)模式探索與實(shí)戰(zhàn)【迭代器模式】一文中,對(duì)于迭代器設(shè)計(jì)模式,做過深入剖析,迭代器模式重在容器類集合提供順序遍歷的方式,其實(shí)從上面Demo、實(shí)踐案例、源碼中,大家都可以看到,迭代器模式,實(shí)際上就是把不同類型的集合的遍歷進(jìn)行了封裝, 這樣針對(duì)于客戶端來說,只需關(guān)注迭代器接口,不再需要關(guān)心內(nèi)部使用了什么類型的集合。
2.3.2 Enumeration
我們看一下這個(gè)接口的源碼
package java.util;
/**
* @see java.util.Iterator
* @see java.io.SequenceInputStream
* @see java.util.Enumeration#nextElement()
* @see java.util.Hashtable
* @see java.util.Hashtable#elements()
* @see java.util.Hashtable#keys()
* @see java.util.Vector
* @see java.util.Vector#elements()
*
* @author Lee Boynton
* @since JDK1.0
*/
public interface Enumeration<E> {
boolean hasMoreElements();
E nextElement();
}
只有是否還有元素的判斷接口、遍歷下一個(gè)元素的兩個(gè)方法定義,并沒有移除方法,所以這個(gè)玩意,自然而然就不存在Fail-fast和ConcurrentModificationException了。
2.3.3 Enumeration與Iterator異同總結(jié)
其實(shí)一看源碼,相信大家就立馬明白了,Enumeration與Iterator都是java定義的集合遍歷接口,不同的是Iterator提供了移除接口。
有了移除操作,自然而然就是涉及到多線程安全性,那么就引入了可能存在的ConcurrentModificationException。文章來源:http://www.zghlxwxcb.cn/news/detail-816003.html
2.4 Fail-fast舉例
哪些你常用的數(shù)據(jù)結(jié)構(gòu)是Fail-fast的,哪些不是?上面源碼的時(shí)候,其實(shí)大家已經(jīng)看到了答案。
Arraylist、HashMap(LinkedHashmap、HashSet本身就是繼承與Hashmap的)是有Fail-fast機(jī)制的,因?yàn)樗麄兌加械鱅terator。而HashTable、Vector的某些
遍歷方式是沒有的,因?yàn)樗鼘?shí)現(xiàn)與Enumeration。文章來源地址http://www.zghlxwxcb.cn/news/detail-816003.html
* @see java.util.Iterator
* @see java.io.SequenceInputStream
* @see java.util.Enumeration#nextElement()
* @see java.util.Hashtable
* @see java.util.Hashtable#elements()
* @see java.util.Hashtable#keys()
* @see java.util.Vector
* @see java.util.Vector#elements()
public class Itbird{
public static void main(String[] args){
Vector v = new Vector();
v.addElement("my");
v.addElement("you");
Enumeration e = v.elements();//返回Enumeration對(duì)象
while(e.hasMoreElements()){
String value = (String)e.nextElement();//調(diào)用nextElement方法獲得元素
System.out.print(value);
}
}
}
到了這里,關(guān)于【字節(jié)面試】Fail-fast知識(shí)點(diǎn)相關(guān)知識(shí)點(diǎn)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!