ConcurrentHashMapの実装に関する優れた概要を説明する記事「Javaの理論と実践:より良いHashMapの構築」を読んでいました。
また、Stackoverflowでいくつかの議論をここで見つけました。
ConcurrentHashMapが使用されている「シナリオ/アプリケーション/場所は何ですか」ということを頭に入れていましたが、疑問に思います。
ありがとうございました
ConcurrentHashMapの実装に関する優れた概要を説明する記事「Javaの理論と実践:より良いHashMapの構築」を読んでいました。
また、Stackoverflowでいくつかの議論をここで見つけました。
ConcurrentHashMapが使用されている「シナリオ/アプリケーション/場所は何ですか」ということを頭に入れていましたが、疑問に思います。
ありがとうございました
マップを使用して複数のスレッドを計画することを除いて、を使用ConcurrentHashMap
するのと同じインスタンスでを使用します。HashMap
たとえば、マルチスレッドサーバーでユーザーIDからユーザーオブジェクトをすばやく検索するために使用します。
ネットワークスレッド、定期的なタスク用のタイマースレッド、およびコンソール入力を処理するためのスレッドがあります。複数のスレッドがユーザーのハッシュマップにアクセスするため、スレッドセーフである必要があります。
ConcurrentHashMap
次の理由により、大規模なマップまたは多数の読み取り/書き込み操作に使用することをお勧めします。
次の例を考えてみましょう。
public class ConcurrentHashMapExample {
public static void main(String[] args) {
//ConcurrentHashMap
Map<String,String> myMap = new ConcurrentHashMap<String,String>();
myMap.put("1", "1");
myMap.put("2", "1");
myMap.put("3", "1");
myMap.put("4", "1");
myMap.put("5", "1");
myMap.put("6", "1");
System.out.println("ConcurrentHashMap before iterator: "+myMap);
Iterator<String> itr1 = myMap.keySet().iterator();
while(itr1.hasNext()){
String key = itr1.next();
if(key.equals("3")) myMap.put(key+"new", "new3");
}
System.out.println("ConcurrentHashMap after iterator: "+myMap);
//HashMap
myMap = new HashMap<String,String>();
myMap.put("1", "1");
myMap.put("2", "1");
myMap.put("3", "1");
myMap.put("4", "1");
myMap.put("5", "1");
myMap.put("6", "1");
System.out.println("HashMap before iterator: "+myMap);
Iterator<String> itr2 = myMap.keySet().iterator();
while(itr2.hasNext()){
String key = itr2.next();
if(key.equals("3")) myMap.put(key+"new", "new3");
}
System.out.println("HashMap after iterator: "+myMap);
}
}
出力は次のようになります。
ConcurrentHashMap before iterator: {1=1, 5=1, 6=1, 3=1, 4=1, 2=1}
ConcurrentHashMap after iterator: {1=1, 3new=new3, 5=1, 6=1, 3=1, 4=1, 2=1}
HashMap before iterator: {3=1, 2=1, 1=1, 6=1, 5=1, 4=1}
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.HashMap$HashIterator.nextEntry(HashMap.java:793)
at java.util.HashMap$KeyIterator.next(HashMap.java:828)
at com.test.ConcurrentHashMapExample.main(ConcurrentHashMapExample.java:44)
ご覧のとおり、現在反復しているマップを変更しようとすると、 HashMap
aがスローされます。ConcurrentModificationException
(具体的には、ステートメントで例外がスローされますString key = itr1.next();
:)