哈希映射的线程安全实现

时间:2013-08-01 16:55:29

标签: java thread-safety concurrenthashmap locks

首先,我将描述我想要的内容,然后我会详细说明我正在考虑的可能性。我不知道哪个是最好的,所以我想要一些帮助。

我有一个哈希映射,我在其上从Servlet读取和写入操作。现在,由于这个Servlet在Tomcat上,我需要哈希映射是线程安全的。基本上,当它被写入时,没有别的东西可以写入它,也没有什么东西能够读它。

我见过ConcurrentHashMap但注意到它的get方法不是线程安全的。然后,我看到了锁和一些叫做synchronized的东西。

我想知道哪种方法最可行。

5 个答案:

答案 0 :(得分:17)

ConcurrentHashMap.get()是线程安全的。

您可以使用HashMap

包装Collections.synchronizedMap()线程,使{{1}}线程安全

答案 1 :(得分:3)

Collections.synchronizedMap(new HashMap<K, V>);

  

返回由指定映射支持的同步(线程安全)映射。为了保证串行访问,必须通过返回的映射完成对支持映射的所有访问。

     

当迭代任何集合视图时,用户必须手动同步返回的地图:

答案 2 :(得分:3)

编辑:删除了错误信息

在任何情况下,synchronized关键字都是安全的选择。它阻止任何线程在synchronized块内访问对象。

// Anything can modify map at this point, making it not thread safe
map.get(0);

而不是

// Nothing can modify map until the synchronized block is complete
synchronized(map) {
    map.get(0);
}

答案 3 :(得分:2)

我建议你选择ConcurrentHashMap,你之前提到的要求,之前我对我们的应用程序也有相同类型的要求,但我们更关注性能方面。< / p>

我运行ConcurrentHashMapColecctions.synchronizedMap();返回的地图,在各种类型的负载下使用JMeter一次启动多个线程,我使用JProfiler监控它们。在所有这些测试之后我们得出结论Colecctions.synchronizedMap()返回的地图在ConcurrentHashMap的comaprison中的表现效率不高。

关于我对两者的体验,我也写了post

由于

答案 4 :(得分:0)

这是ConcurrentHashMap类的重点。当你有超过1个帖子时,它会保护你的收藏。