`
yanguz123
  • 浏览: 568140 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

\(^_^)/ Java中的并发集合(Concurrent Collections)

 
阅读更多

 

 

并发集合:

 

用于多线程上下文中的 Collection 实现:ConcurrentHashMap、ConcurrentSkipListMap、ConcurrentSkipListSet、CopyOnWriteArrayList 和 CopyOnWriteArraySet。

当期望许多线程访问一个给定 collection 时,ConcurrentHashMap 通常优于同步的 HashMap,ConcurrentSkipListMap 通常优于同步的 TreeMap。

当期望的读数和遍历远远大于列表的更新数时,CopyOnWriteArrayList 优于同步的 ArrayList。 

此包中与某些类一起使用的“Concurrent&rdquo前缀;是一种简写,表明与类似的“同步”类有所不同。

例如,java.util.Hashtable 和 Collections.synchronizedMap(new HashMap()) 是同步的,但 ConcurrentHashMap 则是“并发的”。

并发 collection 是线程安全的,但是不受单个排他锁的管理。

在 ConcurrentHashMap 这一特定情况下,它可以安全地允许进行任意数目的并发读取,以及数目可调的并发写入。

需要通过单个锁不允许对 collection 的所有访问时,“同步”类是很有用的,其代价是较差的可伸缩性。

在期望多个线程访问公共 collection 的其他情况中,通常“并发”版本要更好一些。

当 collection 是未共享的,或者仅保持其他锁时 collection 是可访问的情况下,非同步 collection 则要更好一些。 

大多数并发 Collection 实现(包括大多数 Queue)与常规的 java.util 约定也不同,因为它们的迭代器提供了弱一致的,而不是快速失败的遍历。

弱一致的迭代器是线程安全的,但是在迭代时没有必要冻结 collection,所以它不一定反映自迭代器创建以来的所有更新。 

 

 

1.ConcurrentHashMap

(1).支持获取的完全并发和更新的所期望可调整并发的哈希表。

(2).此类遵守与 Hashtable 相同的功能规范,并且包括对应于 Hashtable 的每个方法的方法版本。

(3).尽管所有操作都是线程安全的,但获取操作不 必锁定,并且不 支持以某种防止所有访问的方式锁定整个表。

(4).此类可以通过程序完全与 Hashtable 进行互操作,这取决于其线程安全,而与其同步细节无关。 

(5).获取操作(包括 get)通常不会受阻塞,因此,可能与更新操作交迭(包括 put 和 remove)。

(6).获取会影响最近完成的 更新操作的结果。

(7).对于一些聚合操作,比如 putAll 和 clear,并发获取可能只影响某些条目的插入和移除。类似地,在创建迭代器/枚举时或自此之后,Iterators 和 Enumerations 返回在某一时间点上影响哈希表状态的元素。它们不会 抛出 ConcurrentModificationException。

(8).迭代器被设计成每次仅由一个线程使用。 

(9).这允许通过可选的 concurrencyLevel 构造方法参数(默认值为 16)来引导更新操作之间的并发,该参数用作内部调整大小的一个提示。表是在内部进行分区的,试图允许指示无争用并发更新的数量。因为哈希表中的位置基本上是随意的,所以实际的并发将各不相同。

(10).理想情况下,应该选择一个尽可能多地容纳并发修改该表的线程的值。使用一个比所需要的值高很多的值可能会浪费空间和时间,而使用一个显然低很多的值可能导致线程争用。对数量级估计过高或估计过低通常都会带来非常显著的影响。

(11).当仅有一个线程将执行修改操作,而其他所有线程都只是执行读取操作时,才认为某个值是合适的。

(12).重新调整此类或其他任何种类哈希表的大小都是一个相对较慢的操作,因此,在可能的时候,提供构造方法中期望表大小的估计值是一个好主意。 

(13).此类及其视图和迭代器实现了 Map 和 Iterator 接口的所有可选 方法。 

(14).此类与 Hashtable 相似,但与 HashMap 不同,它不 允许将 null 用作键或值。 

 

2.ConcurrentSkipListMap

(1).可缩放的并发 ConcurrentNavigableMap 实现。

(2).映射可以根据键的自然顺序进行排序,也可以根据创建映射时所提供的 Comparator 进行排序,具体取决于使用的构造方法。 

(3).此类实现 SkipLists 的并发变体,为 containsKey、get、put、remove 操作及其变体提供预期平均 log(n) 时间开销。

(4).多个线程可以安全地并发执行插入、移除、更新和访问操作。

(5).迭代器是弱一致 的,返回的元素将反映迭代器创建时或创建后某一时刻的映射状态。它们不 抛出 ConcurrentModificationException,可以并发处理其他操作。

(6).升序键排序视图及其迭代器比降序键排序视图及其迭代器更快。 

(7).此类及此类视图中的方法返回的所有 Map.Entry 对,表示他们产生时的映射关系快照。它们不 支持 Entry.setValue 方法。(注意,根据所需效果,可以使用 put、putIfAbsent 或 replace 更改关联映射中的映射关系。) 

(8).请注意,与在大多数 collection 中不同,这里的 size 方法不是 一个固定时间 (constant-time) 操作。因为这些映射的异步特性,确定元素的当前数目需要遍历元素。

(9).批量操作 putAll、equals 和 clear 并不 保证能以原子方式 (atomically) 执行。例如,与 putAll 操作一起并发操作的迭代器只能查看某些附加元素。 

(10).此类及其视图和迭代器实现 Map 和 Iterator 接口的所有可选 方法。

(11).与大多数其他并发 collection 一样,此类不 允许使用 null 键或值,因为无法可靠地区分 null 返回值与不存在的元素值。 

 

3.ConcurrentSkipListSet

(1).一个基于 ConcurrentSkipListMap 的可缩放并发 NavigableSet 实现。

(2).set 的元素可以根据它们的自然顺序进行排序,也可以根据创建 set 时所提供的 Comparator 进行排序,具体取决于使用的构造方法。 

(3).此实现为 contains、add、remove 操作及其变体提供预期平均 log(n) 时间开销。

(4).多个线程可以安全地并发执行插入、移除和访问操作。

(5).迭代器是弱一致 的,返回的元素将反映迭代器创建时或创建后某一时刻的 set 状态。它们不 抛出 ConcurrentModificationException,可以并发处理其他操作。

(6).升序排序视图及其迭代器比降序排序视图及其迭代器更快。 

(7).请注意,与在大多数 collection 中不同,这里的 size 方法不是 一个固定时间 (constant-time) 操作。由于这些 set 的异步特性,确定元素的当前数目需要遍历元素。

(8).批量操作 addAll、removeAll、retainAll 和 containsAll 并不 保证能以原子方式 (atomically) 执行。例如,与 addAll 操作一起并发操作的迭代器只能查看某些附加元素。 

(9).此类及其迭代器实现 Set 和 Iterator 接口的所有可选 方法。

(10).与大多数其他并发 collection 实现一样,此类不允许使用 null 元素,因为无法可靠地将 null 参数及返回值与不存在的元素区分开来。 

 

4.CopyOnWriteArrayList

(1).ArrayList 的一个线程安全的变体,其中所有可变操作(add、set 等等)都是通过对底层数组进行一次新的复制来实现的。 

(2).这一般需要很大的开销,但是当遍历操作的数量大大超过可变操作的数量时,这种方法可能比其他替代方法更 有效。

(3).在不能或不想进行同步遍历,但又需要从并发线程中排除冲突时,它也很有用。

(4).“快照”风格的迭代器方法在创建迭代器时使用了对数组状态的引用。

(5).此数组在迭代器的生存期内不会更改,因此不可能发生冲突,并且迭代器保证不会抛出 ConcurrentModificationException。

(6).创建迭代器以后,迭代器就不会反映列表的添加、移除或者更改。

(7).在迭代器上进行的元素更改操作(remove、set 和 add)不受支持。这些方法将抛出 UnsupportedOperationException。 

(8).允许使用所有元素,包括 null。 

(9).内存一致性效果:当存在其他并发 collection 时,将对象放入 CopyOnWriteArrayList 之前的线程中的操作 happen-before 随后通过另一线程从 CopyOnWriteArrayList 中访问或移除该元素的操作。 

 

5.CopyOnWriteArraySet

(1).对其所有操作使用内部 CopyOnWriteArrayList 的 Set。

(2).它最适合于具有以下特征的应用程序:set 大小通常保持很小,只读操作远多于可变操作,需要在遍历期间防止线程间的冲突。 

(3).它是线程安全的。 

(4).因为通常需要复制整个基础数组,所以可变操作(add、set 和 remove 等等)的开销很大。 

(5).迭代器不支持可变 remove 操作。 

(6).使用迭代器进行遍历的速度很快,并且不会与其他线程发生冲突。在构造迭代器时,迭代器依赖于不变的数组快照。

 

分享到:
评论

相关推荐

    java并发集合

    在Java编程中,"java并发集合"是一个关键领域,它涉及到多线程环境下如何有效地管理和操作数据集合。Java提供了一系列的并发集合类,使得在并发环境中实现高效且线程安全的数据处理成为可能。这些集合主要存在于`...

    使用Java并发编程Concurrent Programming Using Java

    下面将根据提供的标题、描述以及部分上下文信息,对Java并发编程中的关键知识点进行详细介绍。 ### 并发编程概述 并发编程是指让程序能够在同一时间处理多个任务的能力。在Java中实现并发编程的主要方式是通过多...

    Java多线程安全集合

    在Java中,线程安全的集合主要分为三类:同步集合、并发集合和不可变集合。 1. 同步集合(Synchronized Collections): 这些是基于非线程安全的集合(如ArrayList、HashMap)通过`Collections.synchronized*`方法...

    Java高并发经典文档-PDF-可在电子书里查看

    《实战Java高并发程序设计》是一本专注于Java并发编程的经典文献,它深入浅出地讲解了如何在Java环境中处理高并发场景。这本书是PDF格式,包含详细的目录,方便读者快速定位到所需的知识点,是Java开发者提升并发...

    实战Java高并发程序设计第二版随书代码

    这本书涵盖了Java并发编程的核心概念和技术,旨在帮助开发者在实际项目中高效地处理高并发场景。随书附带的代码提供了丰富的示例,以便读者能够更直观地理解并实践这些理论知识。 1. **Java并发基础** - **线程与...

    Java-concurrent-collections-concurrenthashmap-blockingqueue.pdf

    Java 并发集合是 Java 语言中的一种高级hread-safe 集合框架,用于在多线程环境中实现高效、安全的数据存储和访问。其中,ConcurrentHashMap 和 BlockingQueue 是两种常用的并发集合类型,它们提供了高效的并发操作...

    实现Java高并发隔离 模拟

    6. **并发容器(Concurrent Collections)**:Java提供了一系列线程安全的集合类,如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,它们内部实现了高效的并发控制策略。 在模拟高并发隔离时,我们通常会用到以下...

    Apress的《Java Collections》

    对于性能敏感的应用,了解如何正确使用这些并发集合是非常重要的。 另外,作者还会讨论Java 8引入的Stream API,这是一种新的处理集合数据的方式,提供了函数式编程风格,可以进行复杂的过滤、映射和聚合操作。...

    java.util.concurrent系列文章(2)

    在上一篇文章中,我们简要介绍了并发集合类的基本概念及其重要性,并探讨了如何通过共享数据结构的方法来提高程序的并发性和吞吐量。本文将继续深入到 `java.util.concurrent` 包中的 `ConcurrentHashMap` 类,它是...

    java自带并发框架

    - **并发集合(Concurrent Collections)**:如`ConcurrentHashMap`、`ConcurrentLinkedQueue`等,提供了线程安全的数据结构,减少了对锁的依赖,提高了并发性能。 ### 并发策略 在设计并发程序时,需要考虑以下...

    java工具类集合

    Java工具类集合是Java开发中不可或缺的一部分,它们提供了一系列便捷的方法,帮助开发者高效地处理各种常见任务。在Java中,工具类通常被组织在各种包下,如`java.util`、`java.lang`、`java.io`等。下面将详细介绍...

    《Java 并发编程实战》.zip

    Java平台提供了丰富的并发工具和API,如线程(Thread)、守护线程(Daemon Thread)、线程池(ExecutorService)、锁(synchronized关键字和Lock接口)、并发集合(Concurrent Collections)等,这些都为开发者提供...

    java高级并发编程32例

    3. **并发容器**:Java集合框架提供了线程安全的容器,如Vector、Collections.synchronizedList()、ConcurrentHashMap等,这些容器在内部实现了同步,减少了程序员对并发控制的负担。 4. **线程池**:...

    JAVA_API_1.7中文版

    8. **集合工厂方法**:Java 1.7对集合框架进行了优化,添加了工厂方法,如`Collections.emptyList()`, `Collections.singleton()`, `Map.of()`, 等,方便创建不可变的集合实例。 9. **元注解的可重复性**:从Java ...

    Java 并发核心编程原文+译文

    Java并发核心编程是Java开发中的重要领域,它涉及到多线程和高效率程序设计的关键技术。在Java 5和Java 6中,JVM引入了大量的并发工具和改进,以支持多处理器和多核系统上的高性能应用程序。以下是这些知识点的详细...

    Java并发编程(一)

    并发集合(Concurrent Collections):Java并发工具包提供了一套特殊的集合类,如ConcurrentHashMap、CopyOnWriteArrayList等,它们在内部实现了高效线程安全的并发操作。 线程池(Thread Pool):ExecutorService...

    Java虚拟机并发编程

    7. **并发集合**:Java的`java.util.concurrent`包提供了如`ConcurrentHashMap`、`CopyOnWriteArrayList`等并发友好的集合,它们内部实现了线程安全的算法,允许在并发环境中高效操作。 8. **Future和Callable接口*...

    Java 并发编程实战

    书中详细讨论了线程安全的集合类,如`Vector`, `Collections.synchronizedXXX`方法生成的同步集合,以及`ConcurrentHashMap`, `CopyOnWriteArrayList`, `BlockingQueue`等并发集合,它们在多线程环境下的性能和使用...

Global site tag (gtag.js) - Google Analytics