一般来说:在map中concurrenthashmap在同步锁问题上效率较高
http://www.iteye.com/topic/164644
软件包 java.util.concurrent 的描述
在并发编程中很常用的实用工具类。此包包括了几个小的、已标准化的可扩展框架,以及一些提供有用功能的类,没有这些类,这些功能会很难实现或实现起来冗长乏味。下面简要描述主要的组件。另请参阅locks 和 atomic 包。
执行程序
接口。Executor 是一个简单的标准化接口,用于定义类似于线程的自定义子系统,包括线程池、异步 IO 和轻量级任务框架。根据所使用的具体 Executor 类的不同,可能在新创建的线程中,现有的任务执行线程中,或者调用 execute()的线程中执行任务,并且可能顺序或并发执行。ExecutorService提供了多个完整的异步任务执行框架。ExecutorService 管理任务的排队和安排,并允许受控制的关闭。ScheduledExecutorService子接口及相关的接口添加了对延迟的和定期任务执行的支持。ExecutorService 提供了安排异步执行的方法,可执行由Callable 表示的任何函数,结果类似于Runnable。Future 返回函数的结果,允许确定执行是否完成,并提供取消执行的方法。RunnableFuture是拥有 run 方法的 Future,run 方法执行时将设置其结果。
实现。类 ThreadPoolExecutor和 ScheduledThreadPoolExecutor提供可调的、灵活的线程池。Executors 类提供大多数 Executor 的常见类型和配置的工厂方法,以及使用它们的几种实用工具方法。其他基于Executor 的实用工具包括具体类 FutureTask,它提供 Future 的常见可扩展实现,以及 ExecutorCompletionService,它有助于协调对异步任务组的处理。
队列
java.util.concurrent ConcurrentLinkedQueue类提供了高效的、可伸缩的、线程安全的非阻塞 FIFO 队列。java.util.concurrent 中的五个实现都支持扩展的 BlockingQueue接口,该接口定义了 put 和 take 的阻塞版本:LinkedBlockingQueue、ArrayBlockingQueue、SynchronousQueue、PriorityBlockingQueue和 DelayQueue。这些不同的类覆盖了生产者-使用者、消息传递、并行任务执行和相关并发设计的大多数常见使用的上下文。BlockingDeque接口扩展 BlockingQueue,以支持 FIFO 和 LIFO(基于堆栈)操作。LinkedBlockingDeque类提供一个实现。
计时
TimeUnit 类为指定和控制基于超时的操作提供了多重粒度(包括纳秒级)。该包中的大多数类除了包含不确定的等待之外,还包含基于超时的操作。在使用超时的所有情况中,超时指定了在表明已超时前该方法应该等待的最少时间。在超时发生后,实现会“尽力”检测超时。但是,在检测超时与超时之后再次实际执行线程之间可能要经过不确定的时间。接受超时期参数的所有方法将小于等于 0 的值视为根本不会等待。要“永远”等待,可以使用Long.MAX_VALUE 值。
同步器
四个类可协助实现常见的专用同步语句。Semaphore 是一个经典的并发工具。CountDownLatch是一个极其简单但又极其常用的实用工具,用于在保持给定数目的信号、事件或条件前阻塞执行。CyclicBarrier是一个可重置的多路同步点,在某些并行编程风格中很有用。Exchanger 允许两个线程在 collection 点交换对象,它在多流水线设计中是有用的。
并发 Collection
除队列外,此包还提供了设计用于多线程上下文中的 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,所以它不一定反映自迭代器创建以来的所有更新。
内存一致性属性
Java Language Specification 第 17 章定义了内存操作(如共享变量的读写)的 happen-before 关系。只有写入操作 happen-before 读取操作时,才保证一个线程写入的结果对另一个线程的读取是可视的。synchronized和 volatile 构造 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.unlock、Semaphore.release 和 CountDownLatch.countDown)之前的操作 happen-before 另一线程中相同同步储存对象成功“获取”方法(如 Lock.lock、Semaphore.acquire、Condition.await 和 CountDownLatch.await)的后续操作。
- 对于通过 Exchanger 成功交换对象的每个线程对,每个线程中 exchange() 之前的操作 happen-before 另一线程中对应 exchange() 后续的操作。
- 调用 CyclicBarrier.await 之前的操作 happen-before屏障操作所执行的操作,屏障操作所执行的操作 happen-before 从另一线程中对应 await 成功返回的后续操作。
分享到:
相关推荐
Java提供了一系列的并发集合类,使得在并发环境中实现高效且线程安全的数据处理成为可能。这些集合主要存在于`java.util.concurrent`包中,设计目标是提高并发性能并减少同步开销。 首先,我们要了解Java并发集合的...
本文将结合上述 Bloch 关于线程安全等级的定义,对 Java 集合框架中的集合类进行线程安全性分析,并指出各个集合类在现实的编程环境中需要注意的并发编程的陷阱;同时对集合框架中通用算法对线程安全性的影响进行...
本文介绍了在Java类库中出现的第一个关联的集合类是Hashtable,它是JDK 1.0的一部分。Hashtable提供了一种易于使用的、线程安全的、关联的map功能,这当然也是方便的。然而,线程安全性是凭代价换来的―― Hashtable...
下面将详细介绍动态加载DLL的过程以及并发集合的相关知识。 首先,动态加载DLL的基础在于LoadLibrary和GetProcAddress这两个API函数。LoadLibrary用于在运行时加载指定路径的DLL文件,返回一个模块句柄,这个句柄...
10. **并发集合类**: - `ConcurrentHashMap`:线程安全的HashMap替代品。 - `ConcurrentLinkedQueue`:线程安全的队列实现。 通过研究压缩包中的"Collection"文件,你可以了解如何在实际场景中使用这些集合类,...
在C#中,微软通过System.Collections.Concurrent命名空间提供了一系列并发集合类,这些类设计用于优化多线程和多处理器环境下的性能。这些集合类都实现了IProducerConsumerCollection接口,该接口包含TryAdd和...
这些集合类的设计目的是为了在多线程环境下提供高效、安全的数据共享,避免数据竞争和死锁等问题。以下是对给定文件中涉及知识点的详细解释: 1. **Java并发包简介**: Java并发包(java.util.concurrent)是Java...
在IT行业中,集合类是数据结构的一个重要组成部分,它们提供了组织和操作数据的方便接口。在C#编程语言中,标准库提供了丰富的集合类,如List、Dictionary, TValue>等。然而,有时我们需要处理一个键可以对应多个值...
本文将深入探讨Java集合类的汇总,包括List、Set和Map这三大核心接口及其实现类。 首先,让我们从List接口开始。List是一种有序的集合,允许有重复元素,并且支持通过索引来访问元素。ArrayList和LinkedList是List...
了解了基本的集合类后,我们还要学习一些高级特性,例如迭代器(Iterator)、泛型(Generics)和并发集合(Concurrent Collections)。迭代器用于遍历集合,泛型可以避免类型转换,提高代码的可读性和安全性,而并发...
如果确实需要线程安全,可以使用并发集合,如CopyOnWriteArrayList或ConcurrentHashMap,它们利用了CAS(Casual Atomicity)操作来减少同步带来的性能影响。但是,过度依赖同步可能导致性能下降,因此需要权衡线程安全...
而ConcurrentHashMap和CopyOnWriteArrayList等并发集合类则是为多线程环境设计的,它们在并发性能上有优势。 总的来说,Java集合类是程序设计的基础,理解和熟练使用这些类能极大地提高代码的效率和可维护性。这份...
3. **并发集合**:书中会深入分析并发集合类的设计和使用,如ConcurrentHashMap如何实现线程安全的读写操作,以及CopyOnWriteArrayList在迭代时的线程安全性。 4. **线程池**:Java的Executor框架是管理线程的重要...
Java并发编程实战需要了解Java中的线程模型、锁机制、线程池、并发集合类等概念和技术,以及如何使用Java中的各种并发编程工具和框架来实现高效、可靠的并发编程。 Java并发编程实战的目标是提高程序的响应速度、...
### Java集合类重要知识点 #### 一、概述 在Java编程中,集合类是一个非常重要的概念,主要用于存储和管理对象的集合。Java集合框架主要包括两大类:`Collection`和`Map`。本篇文章将着重介绍`Collection`部分,并...
本文将深入讲解Java集合类,特别是Collection接口和其下的List、Set,以及Map接口中的几个重要实现类。 首先,我们来看Collection接口。Collection是最基本的集合接口,它代表一组Object,即它的元素。Collection...
【集合类及其分支】在Java编程中,集合框架扮演着至关重要的角色,为开发者提供了高效地存储和操作数据的工具。这些工具主要集中在`java.util`包中,其中包括了多种数据结构的实现,如线性表、链表、哈希表等。本文...
- **线程安全的集合类** 如`ConcurrentHashMap`、`CopyOnWriteArrayList`等,它们在内部实现了并发控制,保证了多线程环境下的安全操作。 - **`BlockingQueue`** 是一种线程安全的队列,常用于线程间的通信和协作...
首先,"Java线程并发面试题87.pdf"很可能包含了87个关于Java并发的常见面试问题,这些问题涵盖了线程基础知识、同步机制、线程池、死锁避免与解决、并发集合类的使用等多个方面。例如,可能会讨论Java中如何实现线程...