迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Java >

Java中 ConcurrentHashMap、Hashtable 和 Synchronized Map 的区别

作者:迹忆客 最近更新:2023/02/03 浏览次数:

尽管这三个集合类都是线程安全的并且可以在多线程、并发的 Java 应用程序中使用,但它们之间存在显着差异,这是因为它们如何实现线程安全。 Hashtable 是 JDK 1.1 本身的遗留类,它使用同步方法来实现线程安全。 Hashtable 的所有方法都是同步的,这使得它们在线程数量增加时由于争用而变得非常慢。 Synchronized MapHashtable 也没有太大区别,并且在并发 Java 程序中提供类似的性能。 HashtableSynchronized Map 之间的唯一区别是 later 不是遗留的,我们可以使用 Collections.synchronizedMap() 方法包装任何 Map 以创建它的同步版本。

另一方面,ConcurrentHashMap 专为并发使用而设计,即多个线程。 默认情况下,它同时允许 16 个线程在没有任何外部同步的情况下从 Map 读取和写入。 由于在 ConcurrentHashMap 类的内部实现中使用了剥离锁定技术,它的可扩展性也很强。

HashtableSynchronized Map 不同,它从不锁定整个 Map,而是将 map 分成多个段并在这些段上进行锁定。 尽管如果读取线程的数量大于写入线程的数量,它的性能会更好。

坦率地说,Collections 类是 Java API 的核心,尽管我觉得明智地使用它们是一门艺术。 这是我的个人经验,我通过使用 ArrayList 提高了 Java 应用程序的性能,而遗留代码不必要地使用 Vector 等。在 Java 5 之前,Java Collection 框架的主要缺点之一是缺乏可伸缩性。

在多线程 Java 应用程序中,像 HashtableVector 这样的同步集合类很快成为瓶颈; 为了解决可扩展性问题,JDK 1.5 引入了一些良好的并发集合,它们对于大容量、低延迟系统电子交易系统非常高效。通常,这些是并发快速访问存储数据的支柱。

在本篇文章中,我们将查看 ConcurrentHashMapHashtableHashMapsynchronized Map,并了解 Java 中 ConcurrentHashMapHashtablesynchronized Map 之间的区别。 我们已经在这篇博客中讨论了 Java 中的 HashMap 和 Hashtable 之间的一些关键区别,这些也将帮助大家在面试中回答这个问题。


为什么需要 ConcurrentHashMap 和 CopyOnWriteArrayList

同步集合类 HashtableVector 以及同步包装类 Collections.synchronizedMap()Collections.synchronizedList() 提供了 Map 和 List 的基本条件线程安全实现。 然而,有几个因素使它们不适合在高并发应用程序中使用,例如,它们的单一集合范围锁是可伸缩性的障碍,并且通常需要在迭代期间将集合锁定相当长的时间以防止 ConcurrentModificationException

ConcurrentHashMapCopyOnWriteArrayList 实现提供更高的并发性,同时保持线程安全,但在对调用者的承诺中有一些小的妥协。 ConcurrentHashMapCopyOnWriteArrayList 不一定在所有可能使用 HashMapArrayList 的地方都有用,但它们旨在优化特定的常见情况。 许多并发应用程序将受益于它们的使用。

ConcurrentHashMap 和 Hashtable 的区别

那么 HashtableConcurrentHashMap 之间有什么区别,两者都可以在多线程环境中使用,但是一旦 Hashtable 的大小变得相当大,性能就会下降,因为对于迭代它必须锁定更长的时间。

由于 ConcurrentHashMap 引入了分段的概念,它变得有多大,只有它的某些部分被锁定以提供线程安全,因此许多其他读者仍然可以访问 Map 而无需等待迭代完成。

综上所述,ConcurrentHashMap 只锁定了 Map 的特定部分,而 Hashtable 在迭代时锁定了整个 map。 通过查看这张解释 Java 中 ConcurrentHashMap 内部工作原理的图表,这一点会更加清晰。

Java 中的 ConcurrentHashMap 示例

ConcurrentHashMap 和 Collections.synchronizedMap 的区别

ConcurrentHashMap 是为并发和提高性能而设计的,而本质上是非同步的 HashMap 可以通过使用同步 Map 应用包装器来同步。 下面是Java中 ConcurrentHashMapsynchronized map 的一些常见区别

ConcurrentHashMap 不允许空键或空值,而同步 HashMap 允许一个空键。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

在 Java 中获取文件大小

发布时间:2023/05/01 浏览次数:139 分类:Java

Java 提供了不同的方法来获取文件的字节大小。 本教程演示了在 Java 中获取文件大小的不同方法。使用 Java IO 的文件类获取文件大小 Java IO 包的 File 类提供了以字节为单位获取文件大小的功能。

Java 中的文件分隔符

发布时间:2023/05/01 浏览次数:108 分类:Java

本篇文章介绍了 Java 中的文件分隔符。Java 中的文件分隔符 文件分隔符是用来分隔目录的字符; 例如,Unix 使用 /,Windows 使用 \ 作为文件分隔符。

Java 中的文件过滤器

发布时间:2023/05/01 浏览次数:193 分类:Java

本篇文章介绍如何在 Java 中使用 FileFilter。FileFilter 用于过滤具有特定扩展名的文件。 Java内置包IO和Apache Commons IO为FileFilter提供了类和接口来进行文件过滤操作。

Java 获取 ISO 8601 格式的当前时间戳

发布时间:2023/05/01 浏览次数:132 分类:Java

本篇文章介绍了 ISO 8601 日期格式、其重要性及其在 Java 中的使用。 它还列出了一些优点来强调为什么应该使用 ISO 格式来表示日期。

在 Java 中获取数组的子集

发布时间:2023/05/01 浏览次数:142 分类:Java

本篇文章介绍了几种在 Java 中获取数组子集的方法。使用 Arrays.copyOf() 方法获取数组的子集 使用 Arrays.copyOfRange() 方法获取数组的子集

用 Java 填充二维数组

发布时间:2023/05/01 浏览次数:110 分类:Java

二维数组是基于表结构的,即行和列,填充二维数组不能通过简单的添加到数组操作来完成。 本篇文章介绍如何在 Java 中填充二维数组。

Java 中的自然排序

发布时间:2023/05/01 浏览次数:132 分类:Java

Java 中最常用的顺序是自然顺序。 本文将展示如何使用 naturalOrder() 函数对数组进行排序。

计算 Java 数组中的重复元素

发布时间:2023/05/01 浏览次数:202 分类:Java

本篇文章介绍Java计算数组中重复元素的方法。计算 Java 数组中的重复元素。我们可以创建一个程序来计算数组中的重复元素。 该数组可以是未排序的,也可以是已排序的。

Java 中 List 和 Arraylist 的区别

发布时间:2023/05/01 浏览次数:90 分类:Java

表示为单个单元的一组单个对象称为集合。 在 Java 中,Collection 是一个具有多个已定义接口和类的框架,用于将一组对象表示为一个单元。 它允许我们操纵

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便