我在Hashtable上查询了Collections.synchronizedMap(Map m)的用法。我们知道两者都将返回一个所有方法同步的容器,所以在任何情况下我都看不到性能提升。
那么为什么当Hashtable满足要求时我们有实用方法(Collections.synchronizedMap)。
使用代码进行澄清会很有帮助。
答案 0 :(得分:4)
Hashtable和Collections.synchronized()主要由于历史原因而存在。从Java 5开始,在需要多个线程访问同一集合的大多数情况下,应该使用新的java.util.concurrent包。
当您收到一个非线程安全的集合(例如来自第三方代码)并且您希望在多个线程之间共享它时,Collections.synchronized()仍然很有用,而无需创建新的线程安全/并发集合。
请注意,在大多数情况下,您应该使用java.util.concurrent。同步集合将通过同步对集合的所有访问来保护其内部状态,但这在性能方面效率低下,并且无法解决数据一致性的较大问题。例如,ConcurrentHashMap提供了一个putIfAbsent()方法,可以确保该操作的原子性。
答案 1 :(得分:2)
Map
的实施方式多于HashMap
,您可能希望同步对其中任何一种的访问。