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

Vin*_*C M 46 java collections synchronization hashtable hashmap

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

我有两个问题:

  1. 它与同步每个方法和包装类有什么区别?有哪些方案可以选择其中一种?

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

小智 60

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

Hashtable类的所有方法都是同步的,即锁定是在方法级别完成的,因此可以说互斥锁始终处于Hashtableobject(this)级别.

•该方法Collections.synchronizedMap(Map)返回一个实例,SynchronizedMap该实例是该类的内部Collections类.此类在Synchronized具有互斥锁的块中具有其所有方法.不同之处在于互斥体.内部类SynchronizedMap有两个构造函数,一个只Map作为参数,另一个作为参数接受(MapObject互斥).默认情况下,如果只使用一个合格的第一个构造函数Map,this作为一个互斥.尽管如此,允许开发人员传递另一个互斥对象作为第二个参数,通过该对象,Map方法上的锁定只会对此进行锁定Object,因此限制性较小Hashtable.

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

  • 这是一个多么美妙的答案,强调在休息答案中保持不变的原因.+1 (5认同)
  • 这是非常有趣的信息,但内部的SynchronizedMap类是私有的,并且没有静态方法对应于接受互斥对象作为参数的构造函数的版本,因此开发人员无法真正提供自定义互斥锁,对吧? (4认同)
  • 块级的额外构造函数和同步(与HashTable的方法级别不同)是关键. (3认同)

Nad*_*far 16

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

  1. 两者都提供相同程度的同步.如果您要Hashtable通过Collections.synchronized 进行换行,那么您将具有相同的度数,但具有另一个冗余层,具有同步性.

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