6

我需要一个多线程 Map 对象来在我的 Web 服务器的缓存中使用,并且我需要有null键。

HashMap允许我有空键,但ConcurrentHashMap没有。我尝试创建HashMapusing的同步版本,Collections.synchronizedMap(new HashMap())但它也不接受null密钥。

有没有我可以使用的替代方法,而不必实施某种方式来包装null密钥?

4

2 回答 2

8

Map返回的Collections.synchronizedMap支持Map你给它的所有功能。如果你给它 a HashMap,它支持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同步映射返回的 s 很容易抛出。ConcurrentModificationException另一方面,即使在使用迭代器时更改了底层映射,ConcurrentHashMap也保证迭代器永远不会抛出。ConcurrentModificationException

于 2011-05-26T09:19:37.493 回答