如果说CountDownLatch是一次性的,那么CyclicBarrier正好可以循环使用。它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point)。所谓屏障点就是一组任务执行完毕的时刻。清单1 一个使用CyclicBarrier的例子package xylz....
分类:
编程语言 时间:
2014-12-03 00:00:16
阅读次数:
316
本来想比较全面和深入的谈谈ConcurrentHashMap的,发现网上有很多对HashMap和ConcurrentHashMap分析的文章,因此本小节尽可能的分析其中的细节,少一点理论的东西,多谈谈内部设计的原理和思想。要谈ConcurrentHashMap的构造,就不得不谈HashMap的构造,...
分类:
编程语言 时间:
2014-12-02 23:59:03
阅读次数:
547
在上一篇中介绍了HashMap的原理,这一节是ConcurrentMap的最后一节,所以会完整的介绍ConcurrentHashMap的实现。ConcurrentHashMap原理在读写锁章节部分介绍过一种是用读写锁实现Map的方法。此种方法看起来可以实现Map响应的功能,而且吞吐量也应该不错。但是...
分类:
编程语言 时间:
2014-12-02 23:57:49
阅读次数:
324
可以在对中对元素进行配对和交换的线程的同步点。每个线程将条目上的某个方法呈现给exchange方法,与伙伴线程进行匹配,并且在返回时接收其伙伴的对象。Exchanger 可能被视为SynchronousQueue的双向形式。换句话说Exchanger提供的是一个交换服务,允许原子性的交换两个(多个)...
分类:
编程语言 时间:
2014-12-02 23:56:08
阅读次数:
216
线程池数据结构与线程构造方法由于已经看到了ThreadPoolExecutor的源码,因此很容易就看到了ThreadPoolExecutor线程池的数据结构。图1描述了这种数据结构。图1 ThreadPoolExecutor 数据结构其实,即使没有上述图形描述ThreadPoolExecutor的数...
分类:
编程语言 时间:
2014-12-02 23:56:03
阅读次数:
288
这一节主要是谈谈读写锁的实现。上一节中提到,ReadWriteLock看起来有两个锁:readLock/writeLock。如果真的是两个锁的话,它们之间又是如何相互影响的呢?事实上在ReentrantReadWriteLock里锁的实现是靠java.util.concurrent.locks.Re...
分类:
编程语言 时间:
2014-12-02 23:55:44
阅读次数:
297
此小节介绍几个与锁有关的有用工具。闭锁(Latch)闭锁(Latch):一种同步方法,可以延迟线程的进度直到线程到达某个终点状态。通俗的讲就是,一个闭锁相当于一扇大门,在大门打开之前所有线程都被阻断,一旦大门打开所有线程都将通过,但是一旦大门打开,所有线程都通过了,那么这个闭锁的状态就失效了,门的状...
分类:
编程语言 时间:
2014-12-02 23:55:44
阅读次数:
243
在《并发容器 part 4 并发队列与Queue简介》节中的类图中可以看到,对于Queue来说,BlockingQueue是主要的线程安全版本。这是一个可阻塞的版本,也就是允许添加/删除元素被阻塞,直到成功为止。BlockingQueue相对于Queue而言增加了两个操作:put/take。下面是一...
分类:
编程语言 时间:
2014-12-02 23:54:50
阅读次数:
296
并发包引入的工具类很多方法都会抛出一定的异常,这些异常描述了任务在线程池中执行时发生的例外情况,而通常这些例外需要应用程序进行捕捉和处理。例如在Future接口中有如下一个API:java.util.concurrent.Future.get(long,TimeUnit)throwsInterrup...
分类:
编程语言 时间:
2014-12-02 23:50:26
阅读次数:
227
这个小节介绍Queue的最后一个工具,也是最强大的一个工具。从名称上就可以看到此工具的特点:双向并发阻塞队列。所谓双向是指可以从队列的头和尾同时操作,并发只是线程安全的实现,阻塞允许在入队出队不满足条件时挂起线程,这里说的队列是指支持FIFO/FILO实现的链表。首先看下LinkedBlocking...
分类:
编程语言 时间:
2014-12-02 23:49:50
阅读次数:
208