据我所知,java.util.Hashtable
同步 java.util.Map
中的每个方法接口(interface),而 Collections.synchronizedMap(hash_map)
返回一个包装器对象,其中包含将调用委托(delegate)给实际 hash_map
的同步方法(如果我错了,请纠正我)。
我有两个问题:
同步每个方法和拥有一个包装类有什么区别?有哪些场景可以选择其中一个?
当我们执行
Collections.synchronizedMap(hash_table)
时会发生什么?这是否等同于简单地使用普通的java.util.Hashtable
?
最佳答案
我在这两个类的实现中可以发现的另一个区别如下:
• Hashtable
类的所有方法都是同步的,即锁定是在方法级别完成的,因此可以说互斥锁在 处是always Hashtable
对象(this
)级别。
• Collections.synchronizedMap(Map)
方法返回SynchronizedMap
的实例,它是Collections
类的内部类。这个类的所有方法都在一个带有互斥锁的 Synchronized
block 中。不同之处在于这里的互斥锁。内部类 SynchronizedMap
有两个构造函数,一个只接受 Map
作为参数,另一个接受 Map
和 Object
(mutex) 作为参数。默认情况下,如果使用第一个仅传递 Map
的构造函数,则 this
用作互斥体。不过,开发人员可以将另一个互斥对象作为第二个参数传递,通过该参数,Map
方法上的锁定将仅在该 Object
上,因此限制性小于 哈希表
.
• 因此,Hashtable
使用方法级别的同步,但 Collections.synchronizedMap(Map)
为开发人员提供了一种灵 active ,可以通过 Synchronized
锁定提供的互斥锁 block 。
关于java - Hashtable 和 Collections.synchronizedMap(HashMap) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8875680/