Hashtable和Collections.synchronizedMap(HashMap)之间的区别

据我所知,java.util.Hashtable同步java.util.Map接口中的每个方法,而Collesions.synchronizedMap(hash_map)返回一个包装器对象,其中包含将调用委托给实际的同步方法(如果我错了,请纠正我)。hash_map

我有两个问题:

  1. 同步每个方法并具有包装器类有什么区别?选择一个而不是另一个的场景是什么?

  2. 当我们这样做时会发生什么?这是否等于简单地使用正常值?Collections.synchronizedMap(hash_table)java.util.Hashtable


答案 1

在这两个类的实现中,我还可以找到的另一个区别如下:

•该类的所有方法都已同步,即锁定是在方法级别完成的,因此可以说互斥体始终在对象(this)级别。HashtableHashtable

• 该方法返回一个实例,该实例是该类的内部类。此类的所有方法都位于具有互斥锁的块中。区别在于这里的互斥体。内部类有两个构造函数,一个仅作为参数,另一个将 a 和一个(互斥体)作为参数。默认情况下,如果使用第一个构造函数只传递 一个 ,则将其用作互斥锁。但是,允许开发人员将互斥体的另一个对象作为第二个参数传递,通过该参数,方法上的锁定将仅在该参数上,因此限制性小于 。Collections.synchronizedMap(Map)SynchronizedMapCollectionsSynchronizedSynchronizedMapMapMapObjectMapMapObjectHashtable

• 因此,使用方法级同步,但为开发人员锁定提供的带块的互斥体提供了灵活性。HashtableCollections.synchronizedMap(Map)Synchronized


答案 2

以下是我从一些(希望是正确的)研究中得到的答案:

  1. 两者都提供相同程度的同步。如果要包装 Collections.synchronized,则同步程度相同,但具有另一个冗余层。Hashtable

  2. 和之间的主要区别更多地存在于API级别。因为它是Java遗留代码的一部分,你会看到API得到了增强,以实现接口,成为Java集合框架的一部分。这意味着,如果你要包装,包装的API将仅限于API。因此,如果 的 API 包含在您的行为定义中,那么它显然会被更改/限制。HashtableCollections.synchronizedMap(HashMap)HashtableHashtableMapHashtableCollections.synchronizedMap()HashtableMapHashtable