2016-07-13 4 views
8

フェイルセーフイテレータが別のコピーを作成してそれを処理する場合、どのように元のものに変更が加えられたことに気付いていますか?フェールセーフイテレータのロジックは何ですか?

public class concurrentHashMap { 
    public static void main(String[] args) throws InterruptedException { 
     MapCheck obj1 = new MapCheck(); 
     Thread t1 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       obj1.put(); 
      } 
     }); 

     Thread t2 = new Thread(new Runnable() { 
      @Override 
      public void run() { 
       obj1.iterte(); 
      } 
     }); 

     t1.start(); 
     t2.start(); 
     t1.join(); 
     t2.join(); 
    } 
} 

class MapCheck { 
    Map<Integer,String> map = new ConcurrentHashMap<>(); 
    { 
     map.put(1, "pujan"); 
     map.put(2, "manish"); 
     map.put(3, "swati"); 
    } 

    void iterte() throws InterruptedException { 
     for (int key : map.keySet()) { 
      Thread.sleep(2000); 
      System.out.println(map.get(key)); 
     } 
    } 

    void put() throws InterruptedException{ 
     Thread.sleep(2000); 
     map.put(1, "pujan1"); 
     map.put(2, "manish1"); 
     map.put(3, "swati1"); 
    } 
} 

出力は次のようになります。

pujan1 
manish1 
swati1 

答えて

12

は、Javaの「フェイルセーフ」イテレータのようなものはありません。少なくとも、Java SEの仕様ではこのような用語は定義されていません。したがって、Javaイテレータを記述する際に「フェールセーフ」という用語を使用することは避けてください。

インターネットやその他のスタックオーバーフローに関するさまざまな記事が「フェイルセーフ」という用語を使用していますが、その使用法は決定的ではなく、誤解を招く恐れがあります。私はあなたがそのようなドキュメンテーションに惑わされたと信じています。

「フェイルセーフ」イテレータが別のコピーで動作するとは、どこか読んでいるようです。あなたの例では、ConcurrentHashMapを使用します。実際には、フェイル・ファーストではないイテレータがあります。ただし、CHMのイテレータはコピーでは動作しません。代わりに、彼らはweakly consistentとして公式仕様で記述されているセマンティクスを持っています。定義はやや不器用ですが、本質的に、そのようなイテレータによって報告される要素は、ある時点でコレクションに存在することが保証されています。このようなイテレータは、反復の開始後に行われたコレクションの変更を反映している場合と反映していない場合があります。そのため、イテレータを実行しているスレッドは、他のスレッドによって加えられた変更を認識します。これらのスレッドにはデータ競合があるため、変更の一部またはすべてが表示される可能性もあります。

イテレータがフェイル・ファストでない別のコレクションの例は、CopyOnWriteArrayListです。このコレクションのイテレータはスナップショットを操作するので、コレクションのその後の変更はイテレータを介してと表示されません。は表示されません。

fail-fastイテレータの定義は、ArrayList仕様から完全です。 Javaの他の(並行していない)コレクションのほとんどは、同様に定義されたフェイル・ファースト・イテレーション・ポリシーを持っています。

関連する問題