キーを「変更」できる必要があるため、このパターンに従う必要があります
// lock the collection
Map<String, Object> values = map.remove(key);
key = new TreeSet<String>(key);
// modify copy of key
map.put(key, values);
// unlock the collection.
ConcurrentMap がサポートしていない操作を実行しているため、独自のロックを使用する必要があります。プレーンな HashMap または LinkedHashMap を synchronized または ReentrantReadWriteLock で使用できます。
を使用して同時セットを作成できます
// Added in Java 1.6
Set<String> set = Collections.newSetFromMap(new ConcurrentHashMap<String, Boolean>());
// or to be sorted
Set<String> set = Collections.newSetFromMap(new ConcurrentSkipListMap<String, Boolean>());
ただし、キーの内容を変更することはできないため、使用する必要があるのは
Set<String> key = Collections.unmodifiableSet(treeSet);
// or to be sure its not modified
Set<String> key = Collections.unmodifiableSet(new TreeSet<String>(treeSet));
Map でキーを使用した後にキーを変更できない理由の簡単な例。
Set<String> key1 = new TreeSet<String>();
Map<Set<String>, Boolean> map = new ConcurrentHashMap<Set<String>, Boolean>();
map.put(key1, true);
System.out.println("Is the map ok? "+map.containsKey(key1));
key1.add("hello");
System.out.println("Is the map ok? "+map.containsKey(key1));
版画
Is the map ok? true
Is the map ok? false
一般的な動作は、マップ内のキーが見えなくなることです。これは、マップが hashCode に基づいてキーをバケットに配置するためです。hashCode が変更された場合、間違ったバケットにある可能性があるため、検索しても見つかりません。