2013-11-22 5 views
7

フェイルセーフイテレーターは、throwConcurrentModificationExceptionではありません。フェイルセーフイテレーターと弱く一貫性のあるイテレーター

fail safe iteratorsweakly consistent iteratorsの違いは何ですか?

どちらも同じですか?

+0

http://stackoverflow.com/q/14084104/469220 – Vlad

+3

どちらも同じではありません。 –

+1

http://stackoverflow.com/questions/14084104/concurrenthashmap-returns-a-weakly-consistent-iterator-why-should-we -use-it-any –

答えて

8

Fail-safeととの両方とも、イテレータはConcurrentModificationExceptionを投げません。 CAS(比較交換)に依存している

weakly consistent iterators:コレクションは、いくつかを反映するが、弱一貫性反復子を、持っていない必ずしもすべてが作成されたので、その裏のコレクションに加えられた変更の。たとえば、イテレータが到達する前にコレクション内の要素が変更または削除された場合、これらの変更は確実に反映されますが、挿入の保証はありません。

Fail safe iteratorイテレータメカニズムは、内部コレクションデータ構造体のコピーを作成し、それを使用して要素を反復処理します。これにより、基礎となるデータ構造が変更された場合に、同時の変更例外がスローされることを防ぎます。もちろん、アレイ全体をコピーするオーバーヘッドが導入されています。

public CopyOnWriteArrayList(Collection<? extends E> c) { 
     Object[] elements = c.toArray(); 

     if (elements.getClass() != Object[].class) 
      elements = Arrays.copyOf(elements, elements.length, Object[].class); 
     setArray(elements); 
    } 

参考:

  1. Java Generics and Collections: 11.5. Collections and Thread Safety
  2. Iterators – Fail fast Vs Fail safe
  3. CopyOnWriteArrayListは我々が簡単にコンストラクタのソースを見ることによって見ることができるフェイルセーフイテレータ、とそのような実装であります

関連する問題