Webサーバーのキャッシュで使用するマルチスレッドのMapオブジェクトが必要であり、null
キーが必要です。
HashMap
nullキーを使用できますが、できConcurrentHashMap
ません。HashMap
同期バージョンのusingを作成しようとしましたが、キーもCollections.synchronizedMap(new HashMap())
受け入れません。null
null
キーをラップする方法を実装せずに使用できる代替手段はありますか?
Webサーバーのキャッシュで使用するマルチスレッドのMapオブジェクトが必要であり、null
キーが必要です。
HashMap
nullキーを使用できますが、できConcurrentHashMap
ません。HashMap
同期バージョンのusingを作成しようとしましたが、キーもCollections.synchronizedMap(new HashMap())
受け入れません。null
null
キーをラップする方法を実装せずに使用できる代替手段はありますか?
Map
によって返されるは、あなたがそれを与えるCollections.synchronizedMap
すべての機能をサポートします。Map
を指定するとHashMap
、キーがサポートされnull
ます(また、null
値については、「...「null」キー値が必要です...」と表示されます。これはどちらの方法でも読み取ることができます)。どうしてそうではないと思いますか?
これは期待どおりに機能します。たとえば、次のようになります。
import java.util.*;
public class MapTest
{
public static final void main(String[] args)
{
Map map;
try
{
map = Collections.synchronizedMap(new HashMap());
map.put("one", "a");
System.out.println("Size = " + map.size());
map.put(null, "b");
System.out.println("Size = " + map.size());
System.out.println("map.get(null) = " + map.get(null));
}
catch (Exception ex)
{
System.out.println("Exception: " + ex.getMessage());
ex.printStackTrace(System.out);
}
System.exit(0);
}
}
出力:
サイズ=1 サイズ=2 map.get(null)= b
私の知る限り、キーや値ConcurrentHashMap
をサポートする簡単な方法も同等のクラスもありません。null
ConcurrentHashMap
とはかなり異なりCollections.synchronizedMap(new HashMap())
ます。
まず第一に、同期されたマップは、すべてのアクセスが読み取り専用であっても、同時アクセスが同時に発生するのを防ぐためです。ConcurrentHashMap
同時読み取りアクセスをブロックせず、場合によっては、同時書き込みを受け入れることもあります。
ただし、より重要なことは、イテレータの使用中に基になるマップが変更された場合、Iterator
同期されたマップによって返されるがスローされる傾向があることです。ConcurrentModificationException
一方、イテレータの使用中に基になるマップが変更された場合でも、ConcurrentHashMap
イテレータはスローされないことが保証されています。ConcurrentModificationException