2011-12-19 5 views
0

スレッドと並行処理についてもっと学び、定期的なハッシュテーブルとConcurrentHashMapで遊ぶことを考えました。ConcurrentHashMapがスレッドセーフであることをどのようにテストできますか?

これらのハッシュテーブルの並行性をテストするにはどうすればよいでしょうか?

(明らかにハッシュテーブルがこのテストに失敗します)

私も何とか/テストはどの1(HTまたはconccurrentのHT)を参照して行って読み書きするどのように多くのトラックを保つことができればそれはクールになる速いです。

+0

基本的なハッシュテーブルは高速ですが、スレッドがデータを矛盾させて全体を矛盾させる可能性があることは明らかです。 –

+3

信頼Doug Lea :) – Bozho

+2

安全性は決してテストできません。それが存在しないことを証明するだけです。 –

答えて

6

これは、どのようにテストできるかについての最後の編集に対する回答です。これはHot Licksのコメントにも触れる。実際には、スレッドの安全性は非常に非決定論的なので、実際にはテストすることはできません。また、通常は失敗は長期間にわたって発生します。

スレッドセーフでないHashMapを持つnice race conditionがあります。複数のスレッドでHashMapを実行すると、無限ループに陥る可能性があります。この

Executor e = Executors.newFixedThreadPool(5); 
    public void test(final Map<Object,Object> test){ 
     for(int i =0; i < 5000; i++){ 
      e.submit(new Runnable(){ 
       public void run(){ 
        test.put(new Object(),new Object()); 
       } 
      }); 
     } 
    } 

test(new HashMap<Object,Object>()); //will probably go into an infinite loop 
test(new ConcurrentHashMap<Object,Object>()); //will *never* go into an infinite loop 

のようなコードを実行します。注あなたは無限ループに入り、このテストを複数回実行し、することはできませんので、私はおそらく使用されますが、私はこのテストを行っていると簡単にループが

を発生するために取得することができます
+1

それは本当に美しい競争状態です – biziclop

関連する問題