Semaphore 是一个计数信号量。从概念上讲,信号量维护了一个许可集。如有必要,在许可可用前会阻塞每一个acquire(),然后再获取该许可。每个release()添加一个许可,从而可能释放一个正在阻塞的获取者。但是,不使用实际的许可对象,Semaphore只对可用许可的号码进行计数,并采取相应...
分类:
编程语言 时间:
2014-12-03 00:11:06
阅读次数:
239
从这一节开始正式进入并发容器的部分,来看看JDK 6带来了哪些并发容器。在JDK 1.4以下只有Vector和Hashtable是线程安全的集合(也称并发容器,Collections.synchronized*系列也可以看作是线程安全的实现)。从JDK 5开始增加了线程安全的Map接口Concurr...
分类:
编程语言 时间:
2014-12-03 00:10:26
阅读次数:
166
Java里面线程池的顶级接口是Executor,但是严格意义上讲Executor并不是一个线程池,而只是一个执行线程的工具。真正的线程池接口是ExecutorService。下面这张图完整描述了线程池的类体系结构。首先Executor的execute方法只是执行一个Runnable的任务,当然了从某...
分类:
编程语言 时间:
2014-12-03 00:09:36
阅读次数:
218
ConcurrentLinkedQueue是Queue的一个线程安全实现。先来看一段文档说明。一个基于链接节点的无界线程安全队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列获取操作从队列头...
分类:
编程语言 时间:
2014-12-03 00:08:04
阅读次数:
273
有一段时间没有更新了。接着上节继续吧。Queue除了前面介绍的实现外,还有一种双向的Queue实现Deque。这种队列允许在队列头和尾部进行入队出队操作,因此在功能上比Queue显然要更复杂。下图描述的是Deque的完整体系图。需要说明的是LinkedList也已经加入了Deque的一部分(Link...
分类:
编程语言 时间:
2014-12-03 00:07:50
阅读次数:
216
在Set中有一个排序的集合SortedSet,用来保存按照自然顺序排列的对象。Queue中同样引入了一个支持排序的FIFO模型。并发队列与Queue简介中介绍了,PriorityQueue和PriorityBlockingQueue就是支持排序的Queue。显然一个支持阻塞的排序Queue要比一个非...
分类:
编程语言 时间:
2014-12-03 00:07:36
阅读次数:
212
Queue是JDK 5以后引入的新的集合类,它属于Java Collections Framework的成员,在Collection集合中和List/Set是同一级别的接口。通常来讲Queue描述的是一种FIFO的队列,当然不全都是,比如PriorityQueue是按照优先级的顺序(或者说是自然顺序...
分类:
编程语言 时间:
2014-12-03 00:04:45
阅读次数:
245
死锁与活跃度前面谈了很多并发的特性和工具,但是大部分都是和锁有关的。我们使用锁来保证线程安全,但是这也会引起一些问题。锁顺序死锁(lock-ordering deadlock):多个线程试图通过不同的顺序获得多个相同的资源,则发生的循环锁依赖现象。动态的锁顺序死锁(Dynamic Lock Orde...
分类:
编程语言 时间:
2014-12-03 00:03:03
阅读次数:
296
接上篇,这篇从Lock.lock/unlock开始。特别说明在没有特殊情况下所有程序、API、文档都是基于JDK 6.0的。public void java.util.concurrent.locks.ReentrantLock.lock()获取锁。如果该锁没有被另一个线程保持,则获取该锁并立即返回...
分类:
编程语言 时间:
2014-12-03 00:01:46
阅读次数:
266
本小节是《并发容器》的最后一部分,这一个小节描述的是针对List/Set接口的一个线程版本。在《并发队列与Queue简介》中介绍了并发容器的一个概括,主要描述的是Queue的实现。其中特别提到一点LinkedList是List/Queue的实现,但是LinkedList确实非线程安全的。不管Bloc...
分类:
编程语言 时间:
2014-12-03 00:00:31
阅读次数:
413