6

Webサーバーのキャッシュで使用するマルチスレッドのMapオブジェクトが必要であり、nullキーが必要です。

HashMapnullキーを使用できますが、できConcurrentHashMapません。HashMap同期バージョンのusingを作成しようとしましたが、キーもCollections.synchronizedMap(new HashMap())受け入れません。null

nullキーをラップする方法を実装せずに使用できる代替手段はありますか?

4

2 に答える 2

8

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
于 2011-04-18T07:36:22.633 に答える
2

私の知る限り、キーや値ConcurrentHashMapをサポートする簡単な方法も同等のクラスもありません。null

ConcurrentHashMapとはかなり異なりCollections.synchronizedMap(new HashMap())ます。

まず第一に、同期されたマップは、すべてのアクセスが読み取り専用であっても、同時アクセスが同時に発生するのを防ぐためです。ConcurrentHashMap同時読み取りアクセスをブロックせず、場合によっては、同時書き込みを受け入れることもあります。

ただし、より重要なことは、イテレータの使用中に基になるマップが変更された場合、Iterator同期されたマップによって返されるがスローされる傾向があることです。ConcurrentModificationException一方、イテレータの使用中に基になるマップが変更された場合でも、ConcurrentHashMapイテレータはスローされないことが保証されています。ConcurrentModificationException

于 2011-05-26T09:19:37.493 に答える