我需要一个多线程 Map 对象来在我的 Web 服务器的缓存中使用,并且我需要有null
键。
HashMap
允许我有空键,但ConcurrentHashMap
没有。我尝试创建HashMap
using的同步版本,Collections.synchronizedMap(new HashMap())
但它也不接受null
密钥。
有没有我可以使用的替代方法,而不必实施某种方式来包装null
密钥?
我需要一个多线程 Map 对象来在我的 Web 服务器的缓存中使用,并且我需要有null
键。
HashMap
允许我有空键,但ConcurrentHashMap
没有。我尝试创建HashMap
using的同步版本,Collections.synchronizedMap(new HashMap())
但它也不接受null
密钥。
有没有我可以使用的替代方法,而不必实施某种方式来包装null
密钥?
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
据我所知,既没有简单的制作方法,也没有支持键或值ConcurrentHashMap
的等效类。null
ConcurrentHashMap
与 完全不同Collections.synchronizedMap(new HashMap())
。
首先,因为同步映射将阻止任何并发访问同时发生,即使所有访问都是只读的。ConcurrentHashMap
不会阻止并发读取访问,在某些情况下,甚至可以接受并发写入。
但更重要的是,如果在使用迭代器时修改了底层映射,则Iterator
同步映射返回的 s 很容易抛出。ConcurrentModificationException
另一方面,即使在使用迭代器时更改了底层映射,ConcurrentHashMap
也保证迭代器永远不会抛出。ConcurrentModificationException