java 集合中的錯誤檢測機制
一、安全失敗機制(fail-safe)
fail-safe:這種遍歷基於容器的一個克隆。因此,對容器內容的修改不影響遍歷。java.util.concurrent包下的容器都是安全失敗的,可以在多執行緒下併發使用,併發修改。常見的的使用fail-safe方式遍歷的容器有ConcerrentHashMap和CopyOnWriteArrayList等。
原理:採用安全失敗機制的集合容器,在遍歷時不是直接在集合內容上訪問的,而是先複製原有集合內容,在拷貝的集合上進行遍歷。由於迭代時是對原集合的拷貝進行遍歷,所以在遍歷過程中對原集合所作的修改並不能被迭代器檢測到,所以不會觸發Concurrent Modification Exception。
缺點:基於拷貝內容的優點是避免了Concurrent Modification Exception,但同樣地,迭代器並不能訪問到修改後的內容,即:迭代器遍歷的是開始遍歷那一刻拿到的集合拷貝,在遍歷期間原集合發生的修改迭代器是不知道的。
Hashtable 是不允許鍵或值為 null 的;這是因為Hashtable使用的是安全失敗機制(fail-safe),這種機制會使你此次讀到的資料不一定是最新的資料;如果你使用null值,就會使得其無法判斷對應的key是不存在還是為空,因為你無法再呼叫一次contain(key)來對key是否存在進行判斷,ConcurrentHashMap同理。
二、快速失敗(fail—fast)
fail-fast 機制,即快速失敗機制,是java集合(Collection)中的一種錯誤檢測機制。當在迭代集合的過程中該集合在結構上發生改變的時候,就有可能會發生fail-fast,即丟擲 ConcurrentModificationException異常。fail-fast機制並不保證在不同步的修改下一定會丟擲異常,它只是盡最大努力去丟擲,所以這種機制一般僅用於檢測bug。
古之學者為己,今之學者為人