4

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

我有一个哈希映射,我在其上从Servlet. 现在,由于这Servlet是在 Tomcat 上,我需要哈希映射是线程安全的。基本上,当它被写入时,没有其他东西应该写入它,也没有任何东西可以读取它。

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

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

4

5 回答 5

19

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

您可以HashMap通过用Collections.synchronizedMap().

于 2013-08-01T16:57:27.597 回答
4

编辑:删除虚假信息

无论如何,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);
}
于 2013-08-01T16:59:46.600 回答
3

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

返回由指定映射支持的同步(线程安全)映射。为了保证串行访问,对支持映射的所有访问都是通过返回的映射完成的,这一点至关重要。

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

于 2013-08-01T16:57:16.390 回答
3

我建议您使用ConcurrentHashMap上面提到的要求,之前我对我们的应用程序也有相同类型的要求,但我们更关注性能方面。

我在各种类型的负载下运行了这两个ConcurrentHashMap 和返回的映射,并使用 JMeter 一次启动多个线程,我使用 JProfiler 监视它们。在所有这些测试之后,我们得出结论,返回的映射在性能方面效率不高与.Colecctions.synchronizedMap();Colecctions.synchronizedMap()ConcurrentHashMap

我也写了一篇关于我对两者的经验的帖子。

谢谢

于 2013-08-01T17:09:32.577 回答
0

这就是 ConcurrentHashMap 类的重点。当您有超过 1 个线程时,它可以保护您的收藏。

于 2013-08-01T17:46:18.373 回答