从这一节开始正式进入线程池的部分。其实整个体系已经拖了很长的时间,因此后面的章节会加快速度,甚至只是一个半成品或者简单化,以后有时间的慢慢补充、完善。其实线程池是并发包里面很重要的一部分,在实际情况中也是使用很多的一个重要组件。下图描述的是线程池API的一部分。广义上的完整线程池可能还包括Threa...
分类:
编程语言 时间:
2014-12-03 00:16:52
阅读次数:
194
主要谈谈锁的性能以及其它一些理论知识,内容主要的出处是《Java Concurrency in Practice》,结合自己的理解和实际应用对锁机制进行一个小小的总结。首先需要强调的一点是:所有锁(包括内置锁和高级锁)都是有性能消耗的,也就是说在高并发的情况下,由于锁机制带来的上下文切换、资源同步等...
分类:
编程语言 时间:
2014-12-03 00:15:48
阅读次数:
122
常见的并发场景线程池并发最常见用于线程池,显然使用线程池可以有效的提高吞吐量。最常见、比较复杂一个场景是Web容器的线程池。Web容器使用线程池同步或者异步处理HTTP请求,同时这也可以有效的复用HTTP连接,降低资源申请的开销。通常我们认为HTTP请求时非常昂贵的,并且也是比较耗费资源和性能的,所...
分类:
编程语言 时间:
2014-12-03 00:14:02
阅读次数:
124
我们知道线程是有多种执行状态的,同样管理线程的线程池也有多种状态。JVM会在所有线程(非后台daemon线程)全部终止后才退出,为了节省资源和有效释放资源关闭一个线程池就显得很重要。有时候无法正确的关闭线程池,将会阻止JVM的结束。线程池Executor是异步的执行任务,因此任何时刻不能够直接获取提...
分类:
编程语言 时间:
2014-12-03 00:13:27
阅读次数:
199
线程池任务执行流程我们从一个API开始接触Executor是如何处理任务队列的。java.util.concurrent.Executor.execute(Runnable)Executes the given task sometime in the future. The task may ex...
分类:
编程语言 时间:
2014-12-03 00:13:19
阅读次数:
175
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