java - Hashtable 和 Collections.synchronizedMap(HashMap) 的区别

标签 java collections synchronization hashmap hashtable

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

我有两个问题:

  1. 同步每个方法和拥有一个包装类有什么区别?有哪些场景可以选择其中一个?

  2. 当我们执行 Collections.synchronizedMap(hash_table) 时会发生什么?这是否等同于简单地使用普通的 java.util.Hashtable

最佳答案

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

Hashtable 类的所有方法都是同步的,即锁定是在方法级别完成的,因此可以说互斥锁在 处是always Hashtable 对象(this)级别。

Collections.synchronizedMap(Map) 方法返回SynchronizedMap 的实例,它是Collections 类的内部类。这个类的所有方法都在一个带有互斥锁的 Synchronized block 中。不同之处在于这里的互斥锁。内部类 SynchronizedMap 有两个构造函数,一个只接受 Map 作为参数,另一个接受 MapObject (mutex) 作为参数。默认情况下,如果使用第一个仅传递 Map 的构造函数,则 this 用作互斥体。不过,开发人员可以将另一个互斥对象作为第二个参数传递,通过该参数,Map 方法上的锁定将仅在该 Object 上,因此限制性小于 哈希表.

• 因此,Hashtable 使用方法级别的同步,但 Collections.synchronizedMap(Map) 为开发人员提供了一种灵 active ,可以通过 Synchronized 锁定提供的互斥锁 block 。

关于java - Hashtable 和 Collections.synchronizedMap(HashMap) 的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8875680/

相关文章:

java - 扩展 `JpaRepository` ,但仅实现子接口(interface)

java - 如何通过实例获取列表的所有元素?

rest - CouchDB 中的并行/冗余复制

java - java 中的同步给出了意外的输出

java - 将路径传递给 exec

java - main()方法中的java args数组混淆(null检查)

java - Gradle 无法编译从域类导入的 jar

c# - 从 List<List<int>> 中删除重复的 List

c# - 用什么集合来存储树结构?

c - 进程结束/死亡时共享 POSIX 对象清理