3

ConcurrentHashMap一部の Javajava.util.concurrentパッケージとして 1.5 で導入されました。threadsafeそれ以前は、マップを取得する唯一の方法はHashTableまたはを使用することでしたCollections.synchronizedMap(Map)

すべての実用的な目的 (マルチスレッド環境) では、スレッドがマップの均一なビューConcurrentHashMapを必要とする 1 つのケースを除いて、ニーズに対処するのに十分です。

私の質問は、マップの統一ビューを持っていることとは別に、それがConcurrentHashMapオプションではない他のシナリオはありますか?

4

3 に答える 3

4

の使用はHashtableJava 1.2 以降推奨されておらず、 のユーティリティsynchronizedMapは非常に制限されており、ほとんどの場合、ロックの粒度が細かすぎるために不十分になります。ただし、個々の更新が必要な粒度であるシナリオがある場合ConcurrentHashMapは、よりも簡単に選択できsynchronizedMapます。並行性が向上し、スレッドセーフなイテレータがあり (いいえ、それらsynchronizedMap はありません。これは、スレッドセーフでないマップのラッパーとして設計されているためです)、全体的なパフォーマンスが向上し、支払う余分なメモリの重みがほとんどありません。それをすべて。

于 2012-08-17T14:56:48.477 に答える
3

これはストレッチですが、ユースケースとして挙げます。

スレッドセーフな Map 実装が必要な場合は、 を介して利用できない追加の複合操作を実行できますConcurrentMap。3 番目のオブジェクトを追加する前に、他の 2 つのオブジェクトが存在しないことを確認したいとします。

Hashtable t = new Hashtable();

synchronized(t){
   if(!t.contains(object1) && !t.contains(object2)){
      t.put(object3,object3);
   }
}

繰り返しますが、これはストレッチですが、原子性とスレッドセーフを確保しながら CHM でこれを達成することはできません。Hashtableaとその対応部分のすべての操作はsynchronizedMapMap のインスタンスで同期されるため、これによりスレッドセーフが保証されます。

synchronizedMap結局のところ、 /を使用することはめったにありませんHashtableが、同じことを行うことをお勧めします。

于 2012-08-17T15:04:16.580 に答える
1

私が理解している限り、スレッドセーフの目的のためのConcurrentMap代替品です。そのすべてのクラスの使用はお勧めできません。したがって、あなたの質問に対する答えは「いいえ、他のシナリオはありません」です。HashTableCollections.synchronizedMap()

参照: ConcurrentHashMap と Collections.synchronizedMap(Map) の違いは何ですか?

于 2012-08-17T14:44:13.080 に答える