- 博客(15)
- 资源 (5)
- 收藏
- 关注
原创 Semaphore
[code="java"]package org.ado.test; import java.util.*; import java.util.concurrent.*; public class SemApp { public static void main(String[] args) { Runnable limitedCall = new Runnable() {...
2011-12-26 22:54:02
105
原创 ConcurrentHashMap
曾经研究过jkd1.5新特性,其中ConcurrentHashMap就是其中之一,其特点:效率比Hashtable高,并发性比hashmap好。结合了两者的特点。 集合是编程中最常用的数据结构。而谈到并发,几乎总是离不开集合这类高级数据结构的支持。比如两个线程需要同时访问一个中间临界区(Queue),比如常会用缓存作为外部文件的副本(HashMap)。这篇文章主要分析jdk1.5的3种并...
2011-12-26 22:53:52
228
原创 ExecutorService
[code="java"]package org.ado.test; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionExcep...
2011-12-26 22:53:38
119
原创 Java中ExecutorService和CompletionService区别
我们现在在Java中使用多线程通常不会直接用Thread对象了,而是会用到java.util.concurrent包下的ExecutorService类来初始化一个线程池供我们使用。 之前我一直习惯自己维护一个list保存submit的callable task所返回的Future对象。 在主线程中遍历这个list并调用Future的get()方法取到Task的返回值。 ...
2011-12-26 22:53:25
127
原创 CompletionService
[code="java"]public int countLines(List javaFiles) throws Exception { // 根据处理器数量创建线程池。虽然多线程并不保证能够提升性能,但适量地 // 开线程一般可以从系统骗取更多资源。 ExecutorService es = Executors.newFixedThreadPool( ...
2011-12-26 22:53:09
73
原创 SynchronousQueue
SynchronousQueue是这样一种阻塞队列,其中每个 put 必须等待一个 take,反之亦然。同步队列没有任何内部容量,甚至连一个队列的容量都没有。 不能在同步队列上进行 peek,因为仅在试图要取得元素时,该元素才存在; 除非另一个线程试图移除某个元素,否则也不能(使用任何方法)添加元素;也不能迭代队列,因为其中没有元素可用于迭代。队列的头是尝试添加到队...
2011-12-25 15:56:23
94
原创 ConcurrentMap
Map 有一个微妙的并发 bug,这个 bug 将许多不知情的 Java 开发人员引入歧途。ConcurrentMap 是最容易的解决方案。 当一个 Map 被从多个线程访问时,通常使用 containsKey() 或者 get() 来查看给定键是否在存储键/值对之前出现。但是即使有一个同步的 Map,线程还是可以在这个过程中潜入,然后夺取对 Map 的控制权。问题是,在对...
2011-12-25 15:56:14
178
原创 CopyOnWriteArrayList
创建数组的全新副本是过于昂贵的操作,无论是从时间上,还是从内存开销上,因此在通常使用中很少考虑;开发人员往往求助于使用同步的 ArrayList。然而,这也是一个成本较高的选择,因为每当您跨集合内容进行迭代时,您就不得不同步所有操作,包括读和写,以此保证一致性。 这又让成本结构回到这样一个场景:需多读者都在读取 ArrayList,但是几乎没人会去修改它。 Co...
2011-12-25 15:56:06
77
原创 CountDownLatch
java.util.concurrent.CountDownLatch它是一个同步辅助类,在完成一组正在其他线程中执行的操作之前,它允许一个或多个线程一直等待。 用给定的计数初始化 CountDownLatch。在调用countDown() 方法,使当前计数减一,且当前计数到达零之前,await 方法会一直受阻塞。当前计数到达零之后,会释放所有等待的线程,await 的所有后续调...
2011-12-25 15:55:43
78
原创 使用Callable返回结果
自从Java平台的最开始,Runnable接口就已存在了。它允许你定义一个可由线程完成的任务。 如大多数人所已知的那样,它只提供了一个run 方法,该方法既不接受任何参数,也不 返回任何值。 如果你需要从一个未完成的任务中返回一个值,你就必须在该接口之外使用一个方法去等待该任务完成时通报的某种消息。 例如,下面的示例就是你在这种情景下可能做的事情: [cod...
2011-12-25 15:55:29
176
原创 PriorityBlockingQueue
一个无界的阻塞队列,它使用与类PriorityQueue相同的顺序规则,并且提供了阻塞检索的操作。 虽然此队列逻辑上是无界的,但是由于资源被耗尽,所以试图执行添加操作可能会失败 (导致 OutOfMemoryError)。 此类不允许使用 null 元素。依赖自然顺序的优先级队列也不允许插入不可比较的对象(因为这样做会抛出 ClassCastException)。 ...
2011-12-24 23:00:54
72
原创 DelayQueue
DelayQueue是实现Delayed接口的元素的一个无界阻塞队列,只有在延迟期满时才能从中提取元素。 Delayed接口定义了getDelay(TimeUnit unit)方法。 该队列的头部是延迟期满后保存时间最长的 Delayed 元素。如果延迟都还没有期满,则队列没有头部,并且 poll 将返回 null。当一个元素的getDelay(TimeUnit uni...
2011-12-24 22:56:22
82
原创 LinkedBlockingQueue
LinkedBlockingQueue是一个基于已链接节点的、范围任意的blocking queue的实现。 此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。 新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列, 但是在大多数并发应用程序中,其可...
2011-12-24 22:51:00
72
原创 ArrayBlockingQueue
一个由数组支持的有界阻塞队列。它的本质是一个基于数组的blocking queue的实现。 它的容纳大小是固定的。此队列按 FIFO(先进先出)原则对元素进行排序。 队列的头部 是在队列中存在时间最长的元素。队列的尾部 是在队列中存在时间最短的元素。 新元素插入到队列的尾部,队列检索操作则是从队列头部开始获得元素。 这是一个典型的“有界缓存...
2011-12-24 22:40:23
101
原创 BlockingQueue
BlockingQueue 接口表示它是一个 Queue,意思是它的项以先入先出(FIFO)顺序存储。在特定顺序插入的项以相同的顺序检索 — [color=#FF0000]但是需要附加保证,从空队列检索一个项的任何尝试都会阻塞调用线程,直到这个项准备好被检索。同理,想要将一个项插入到满队列的尝试也会导致阻塞调用线程,直到队列的存储空间可用。[/color] BlockingQue...
2011-12-24 22:32:30
98
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人