`
w800927
  • 浏览: 119359 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

并发集合类的那些事

阅读更多

一般来说:在map中concurrenthashmap在同步锁问题上效率较高

http://www.iteye.com/topic/164644

软件包 java.util.concurrent 的描述

 

在并发编程中很常用的实用工具类。此包包括了几个小的、已标准化的可扩展框架,以及一些提供有用功能的类,没有这些类,这些功能会很难实现或实现起来冗长乏味。下面简要描述主要的组件。另请参阅locks atomic 包。

 

执行程序

 

接口。Executor 是一个简单的标准化接口,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架。根据所使用的具体 Executor 类的不同,可能在新创建的线程中,现有的任务执行线程中,或者调用 execute()的线程中执行任务,并且可能顺序或并发执行。ExecutorService提供了多个完整的异步任务执行框架。ExecutorService 管理任务的排队和安排,并允许受控制的关闭。ScheduledExecutorService子接口及相关的接口添加了对延迟的和定期任务执行的支持。ExecutorService 提供了安排异步执行的方法,可执行由Callable 表示的任何函数,结果类似于RunnableFuture 返回函数的结果,允许确定执行是否完成,并提供取消执行的方法。RunnableFuture是拥有 run 方法的 Futurerun 方法执行时将设置其结果。

 

实现。ThreadPoolExecutorScheduledThreadPoolExecutor提供可调的、灵活的线程池。Executors 类提供大多数 Executor 的常见类型和配置的工厂方法,以及使用它们的几种实用工具方法。其他基于Executor 的实用工具包括具体类 FutureTask,它提供 Future 的常见可扩展实现,以及 ExecutorCompletionService,它有助于协调对异步任务组的处理。

 

队列

 

java.util.concurrent ConcurrentLinkedQueue类提供了高效的、可伸缩的、线程安全的非阻塞 FIFO 队列。java.util.concurrent 中的五个实现都支持扩展的 BlockingQueue接口,该接口定义了 put take 的阻塞版本:LinkedBlockingQueueArrayBlockingQueueSynchronousQueuePriorityBlockingQueueDelayQueue。这些不同的类覆盖了生产者-使用者、消息传递、并行任务执行和相关并发设计的大多数常见使用的上下文。BlockingDeque接口扩展 BlockingQueue,以支持 FIFO LIFO(基于堆栈)操作。LinkedBlockingDeque类提供一个实现。

 

计时

 

TimeUnit 类为指定和控制基于超时的操作提供了多重粒度(包括纳秒级)。该包中的大多数类除了包含不确定的等待之外,还包含基于超时的操作。在使用超时的所有情况中,超时指定了在表明已超时前该方法应该等待的最少时间。在超时发生后,实现会尽力检测超时。但是,在检测超时与超时之后再次实际执行线程之间可能要经过不确定的时间。接受超时期参数的所有方法将小于等于 0 的值视为根本不会等待。要永远等待,可以使用Long.MAX_VALUE 值。

 

同步器

 

四个类可协助实现常见的专用同步语句。Semaphore 是一个经典的并发工具。CountDownLatch是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号、事件或条件前阻塞执行。CyclicBarrier是一个可重置的多路同步点,在某些并行编程风格中很有用。Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。

 

并发 Collection

 

除队列外,此包还提供了设计用于多线程上下文中的 Collection 实现:ConcurrentHashMapConcurrentSkipListMapConcurrentSkipListSetCopyOnWriteArrayListCopyOnWriteArraySet。当期望许多线程访问一个给定 collection 时,ConcurrentHashMap 通常优于同步的HashMapConcurrentSkipListMap 通常优于同步的TreeMap。当期望的读数和遍历远远大于列表的更新数时,CopyOnWriteArrayList优于同步的 ArrayList

 

此包中与某些类一起使用的“Concurrent&rdquo前缀;是一种简写,表明与类似的同步类有所不同。例如,java.util.HashtableCollections.synchronizedMap(new HashMap()) 是同步的,但ConcurrentHashMap则是并发的。并发 collection 是线程安全的,但是不受单个排他锁的管理。在ConcurrentHashMap 这一特定情况下,它可以安全地允许进行任意数目的并发读取,以及数目可调的并发写入。需要通过单个锁不允许对 collection 的所有访问时,同步类是很有用的,其代价是较差的可伸缩性。在期望多个线程访问公共 collection 的其他情况中,通常并发版本要更好一些。当collection 是未共享的,或者仅保持其他锁时 collection 是可访问的情况下,非同步 collection 则要更好一些。

 

大多数并发 Collection 实现(包括大多数 Queue)与常规的 java.util 约定也不同,因为它们的迭代器提供了弱一致的,而不是快速失败的遍历。弱一致的迭代器是线程安全的,但是在迭代时没有必要冻结 collection,所以它不一定反映自迭代器创建以来的所有更新。

 

内存一致性属性

 

Java Language Specification 第 17 定义了内存操作(如共享变量的读写)的 happen-before 关系。只有写入操作 happen-before 读取操作时,才保证一个线程写入的结果对另一个线程的读取是可视的。synchronizedvolatile 构造 happen-before 关系,Thread.start() Thread.join() 方法形成 happen-before 关系。尤其是:

 

  • 线程中的每个操作 happen-before 稍后按程序顺序传入的该线程中的每个操作。
  • 一个解除锁监视器的(synchronized 阻塞或方法退出)happen-before 相同监视器的每个后续锁(synchronized 阻塞或方法进入)。并且因为 happen-before 关系是可传递的,所以解除锁定之前的线程的所有操作 happen-before 锁定该监视器的任何线程后续的所有操作。
  • 写入 volatile 字段 happen-before 每个后续读取相同字段。volatile 字段的读取和写入与进入和退出监视器具有相似的内存一致性效果,但 需要互斥锁。
  • 在线程上调用 start happen-before 已启动的线程中的任何线程。
  • 线程中的所有操作 happen-before 从该线程上的 join 成功返回的任何其他线程。

 

java.util.concurrent 中所有类的方法及其子包扩展了这些对更高级别同步的保证。尤其是:

 

  • 线程中将一个对象放入任何并发 collection 之前的操作 happen-before 从另一线程中的 collection 访问或移除该元素的后续操作。
  • 线程中向 Executor 提交 Runnable 之前的操作 happen-before 其执行开始。同样适用于向 ExecutorService 提交 Callables
  • 异步计算(由 Future 表示)所采取的操作 happen-before 通过另一线程中 Future.get() 获取结果后续的操作。
  • 释放同步储存方法(如 Lock.unlockSemaphore.release CountDownLatch.countDown)之前的操作 happen-before 另一线程中相同同步储存对象成功获取方法(如 Lock.lockSemaphore.acquireCondition.await CountDownLatch.await)的后续操作。
  • 对于通过 Exchanger 成功交换对象的每个线程对,每个线程中 exchange() 之前的操作 happen-before 另一线程中对应 exchange() 后续的操作。
  • 调用 CyclicBarrier.await 之前的操作 happen-before屏障操作所执行的操作,屏障操作所执行的操作 happen-before 从另一线程中对应 await 成功返回的后续操作。

 

分享到:
评论

相关推荐

    java并发集合

    Java提供了一系列的并发集合类,使得在并发环境中实现高效且线程安全的数据处理成为可能。这些集合主要存在于`java.util.concurrent`包中,设计目标是提高并发性能并减少同步开销。 首先,我们要了解Java并发集合的...

    java集合类线程安全.doc

    本文将结合上述 Bloch 关于线程安全等级的定义,对 Java 集合框架中的集合类进行线程安全性分析,并指出各个集合类在现实的编程环境中需要注意的并发编程的陷阱;同时对集合框架中通用算法对线程安全性的影响进行...

    Java理论与实践:并发集合类

    本文介绍了在Java类库中出现的第一个关联的集合类是Hashtable,它是JDK 1.0的一部分。Hashtable提供了一种易于使用的、线程安全的、关联的map功能,这当然也是方便的。然而,线程安全性是凭代价换来的―― Hashtable...

    动态加载DLL,并发集合

    下面将详细介绍动态加载DLL的过程以及并发集合的相关知识。 首先,动态加载DLL的基础在于LoadLibrary和GetProcAddress这两个API函数。LoadLibrary用于在运行时加载指定路径的DLL文件,返回一个模块句柄,这个句柄...

    java集合类的代码

    10. **并发集合类**: - `ConcurrentHashMap`:线程安全的HashMap替代品。 - `ConcurrentLinkedQueue`:线程安全的队列实现。 通过研究压缩包中的"Collection"文件,你可以了解如何在实际场景中使用这些集合类,...

    C#并发集合的简单方法.pdf

    在C#中,微软通过System.Collections.Concurrent命名空间提供了一系列并发集合类,这些类设计用于优化多线程和多处理器环境下的性能。这些集合类都实现了IProducerConsumerCollection接口,该接口包含TryAdd和...

    多线程并发集合资料.zip

    这些集合类的设计目的是为了在多线程环境下提供高效、安全的数据共享,避免数据竞争和死锁等问题。以下是对给定文件中涉及知识点的详细解释: 1. **Java并发包简介**: Java并发包(java.util.concurrent)是Java...

    多映射集合类

    在IT行业中,集合类是数据结构的一个重要组成部分,它们提供了组织和操作数据的方便接口。在C#编程语言中,标准库提供了丰富的集合类,如List、Dictionary, TValue>等。然而,有时我们需要处理一个键可以对应多个值...

    Java基础----集合类汇总

    本文将深入探讨Java集合类的汇总,包括List、Set和Map这三大核心接口及其实现类。 首先,让我们从List接口开始。List是一种有序的集合,允许有重复元素,并且支持通过索引来访问元素。ArrayList和LinkedList是List...

    java 集合类讲解

    了解了基本的集合类后,我们还要学习一些高级特性,例如迭代器(Iterator)、泛型(Generics)和并发集合(Concurrent Collections)。迭代器用于遍历集合,泛型可以避免类型转换,提高代码的可读性和安全性,而并发...

    Java集合类API.pdf

    如果确实需要线程安全,可以使用并发集合,如CopyOnWriteArrayList或ConcurrentHashMap,它们利用了CAS(Casual Atomicity)操作来减少同步带来的性能影响。但是,过度依赖同步可能导致性能下降,因此需要权衡线程安全...

    java集合类的相关资料

    而ConcurrentHashMap和CopyOnWriteArrayList等并发集合类则是为多线程环境设计的,它们在并发性能上有优势。 总的来说,Java集合类是程序设计的基础,理解和熟练使用这些类能极大地提高代码的效率和可维护性。这份...

    java 并发编程的艺术pdf清晰完整版 源码

    3. **并发集合**:书中会深入分析并发集合类的设计和使用,如ConcurrentHashMap如何实现线程安全的读写操作,以及CopyOnWriteArrayList在迭代时的线程安全性。 4. **线程池**:Java的Executor框架是管理线程的重要...

    Java并发编程实战.pptx

    Java并发编程实战需要了解Java中的线程模型、锁机制、线程池、并发集合类等概念和技术,以及如何使用Java中的各种并发编程工具和框架来实现高效、可靠的并发编程。 Java并发编程实战的目标是提高程序的响应速度、...

    大公司最喜欢问的Java集合类面试题

    ### Java集合类重要知识点 #### 一、概述 在Java编程中,集合类是一个非常重要的概念,主要用于存储和管理对象的集合。Java集合框架主要包括两大类:`Collection`和`Map`。本篇文章将着重介绍`Collection`部分,并...

    Java集合详解,详细讲解java的集合类

    本文将深入讲解Java集合类,特别是Collection接口和其下的List、Set,以及Map接口中的几个重要实现类。 首先,我们来看Collection接口。Collection是最基本的集合接口,它代表一组Object,即它的元素。Collection...

    集合类及其分支

    【集合类及其分支】在Java编程中,集合框架扮演着至关重要的角色,为开发者提供了高效地存储和操作数据的工具。这些工具主要集中在`java.util`包中,其中包括了多种数据结构的实现,如线性表、链表、哈希表等。本文...

    java并发编程2

    - **线程安全的集合类** 如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,它们在内部实现了并发控制,保证了多线程环境下的安全操作。 - **`BlockingQueue`** 是一种线程安全的队列,常用于线程间的通信和协作...

    Java高并发视频教学,并带实战java高并发程序设计,高并发面试题目

    首先,"Java线程并发面试题87.pdf"很可能包含了87个关于Java并发的常见面试问题,这些问题涵盖了线程基础知识、同步机制、线程池、死锁避免与解决、并发集合类的使用等多个方面。例如,可能会讨论Java中如何实现线程...

Global site tag (gtag.js) - Google Analytics