首先,我将描述我想要什么,然后我将详细说明我正在考虑的可能性。我不知道哪个是最好的,所以我需要一些帮助。
我有一个哈希映射,我在其上从Servlet
. 现在,由于这Servlet
是在 Tomcat 上,我需要哈希映射是线程安全的。基本上,当它被写入时,没有其他东西应该写入它,也没有任何东西可以读取它。
我见过ConcurrentHashMap
但注意到它的 get 方法不是线程安全的。然后,我看到了锁和一种叫做同步的东西。
我想知道哪种方法最可靠。
首先,我将描述我想要什么,然后我将详细说明我正在考虑的可能性。我不知道哪个是最好的,所以我需要一些帮助。
我有一个哈希映射,我在其上从Servlet
. 现在,由于这Servlet
是在 Tomcat 上,我需要哈希映射是线程安全的。基本上,当它被写入时,没有其他东西应该写入它,也没有任何东西可以读取它。
我见过ConcurrentHashMap
但注意到它的 get 方法不是线程安全的。然后,我看到了锁和一种叫做同步的东西。
我想知道哪种方法最可靠。
ConcurrentHashMap.get()
是线程安全的。
您可以HashMap
通过用Collections.synchronizedMap()
.
编辑:删除虚假信息
无论如何,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);
}
Collections.synchronizedMap(new HashMap<K, V>);
返回由指定映射支持的同步(线程安全)映射。为了保证串行访问,对支持映射的所有访问都是通过返回的映射完成的,这一点至关重要。
当迭代其任何集合视图时,用户必须在返回的地图上手动同步:
我建议您使用ConcurrentHashMap
上面提到的要求,之前我对我们的应用程序也有相同类型的要求,但我们更关注性能方面。
我在各种类型的负载下运行了这两个ConcurrentHashMap
和返回的映射,并使用 JMeter 一次启动多个线程,我使用 JProfiler 监视它们。在所有这些测试之后,我们得出结论,返回的映射在性能方面效率不高与.Colecctions.synchronizedMap();
Colecctions.synchronizedMap()
ConcurrentHashMap
我也写了一篇关于我对两者的经验的帖子。
谢谢
这就是 ConcurrentHashMap 类的重点。当您有超过 1 个线程时,它可以保护您的收藏。