首先,我将描述我想要的内容,然后我会详细说明我正在考虑的可能性。我不知道哪个是最好的,所以我想要一些帮助。
我有一个哈希映射,我在其上从Servlet
读取和写入操作。现在,由于这个Servlet
在Tomcat上,我需要哈希映射是线程安全的。基本上,当它被写入时,没有别的东西可以写入它,也没有什么东西能够读它。
我见过ConcurrentHashMap
但注意到它的get方法不是线程安全的。然后,我看到了锁和一些叫做synchronized的东西。
我想知道哪种方法最可行。
答案 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>
我运行ConcurrentHashMap
和Colecctions.synchronizedMap();
返回的地图,在各种类型的负载下使用JMeter一次启动多个线程,我使用JProfiler监控它们。在所有这些测试之后我们得出结论Colecctions.synchronizedMap()
返回的地图在ConcurrentHashMap
的comaprison中的表现效率不高。
关于我对两者的体验,我也写了post。
由于
答案 4 :(得分:0)
这是ConcurrentHashMap类的重点。当你有超过1个帖子时,它会保护你的收藏。