Concurrent下的线程安全集合

转载 2016年08月30日 00:42:22

转自:http://www.cnblogs.com/ijavanese/p/3778688.html
1.ArrayBlockingQueue

ArrayBlockingQueue是由数组支持的线程安全的有界阻塞队列,此队列按 FIFO(先进先出)原则对元素进行排序。这是一个典型的“有界缓存区”,固定大小的数组在其中保持生产者插入的元素和使用者提取的元素。一旦创建了这样的缓存区,就不能再增加其容量。试图向已满队列中放入元素会导致操作受阻塞;试图从空队列中提取元素将导致类似阻塞。此类支持对等待的生产者线程和消费者线程进行排序的可选公平策略。默认情况下,不保证是这种排序。然而,通过将公平性 (fairness) 设置为 true 而构造的队列允许按照 FIFO 顺序访问线程。公平性通常会降低吞吐量,但也减少了可变性和避免了“不平衡性”。

复制代码
public ArrayBlockingQueue(int capacity, boolean fair) {
if (capacity <= 0)
throw new IllegalArgumentException();
this.items = new Object[capacity];
lock = new ReentrantLock(fair);
notEmpty = lock.newCondition();
notFull = lock.newCondition();
}
复制代码
从改造方法可以看出,ArrayBlockingQueue的实现机制是ReentrantLock和Condition来实现的。

2、LinkedBlockingDeque

LinkedBlockingDeque是用双向链表实现的,需要说明的是LinkedList也已经加入了Deque的一部分。

/* Maximum number of items in the deque /
private final int capacity;
复制代码
/**
* Creates a {@code LinkedBlockingDeque} with a capacity of
* {@link Integer#MAX_VALUE}.
*/
public LinkedBlockingDeque() {
this(Integer.MAX_VALUE);
}
复制代码
public LinkedBlockingDeque(int capacity) {
if (capacity <= 0) throw new IllegalArgumentException();
this.capacity = capacity;
}
要想支持阻塞功能,队列的容量一定是固定的,否则无法在入队的时候挂起线程。也就是capacity是final类型的。
既然是双向链表,每一个结点就需要前后两个引用,这样才能将所有元素串联起来,支持双向遍历。也即需要prev/next两个引用。
双向链表需要头尾同时操作,所以需要first/last两个节点,当然可以参考LinkedList那样采用一个节点的双向来完成,那样实现起来就稍微麻烦点。
既然要支持阻塞功能,就需要锁和条件变量来挂起线程。这里使用一个锁两个条件变量来完成此功能。

3、LinkedBlockingQueue

LinkedBlockingQueue是一个基于已链接节点的、范围任意的blocking queue的实现,也是线程安全的。按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。

复制代码
/**
* Creates a {@code LinkedBlockingQueue} with a capacity of
* {@link Integer#MAX_VALUE}.
*/
public LinkedBlockingQueue() {
this(Integer.MAX_VALUE);
}
复制代码
public LinkedBlockingQueue(int capacity) {
if (capacity <= 0) throw new IllegalArgumentException();
this.capacity = capacity;
last = head = new Node(null);
}
可选的容量范围构造方法参数作为防止队列过度扩展的一种方法。如果未指定容量,则它等于 Integer.MAX_VALUE。除非插入节点会使队列超出容量,否则每次插入后会动态地创建链接节点。

 此外它还不接受null值:

复制代码
public void put(E e) throws InterruptedException {
if (e == null) throw new NullPointerException();
// Note: convention in all put/take/etc is to preset local var
// holding count negative to indicate failure unless set.
int c = -1;
Node node = new Node(e);
final ReentrantLock putLock = this.putLock;
final AtomicInteger count = this.count;
putLock.lockInterruptibly();
复制代码

4、PriorityBlockingQueue

PriorityBlockingQueue是一个无界的线程安全的阻塞队列,它使用与PriorityQueue相同的顺序规则,并且提供了阻塞检索的操作。

public PriorityBlockingQueue(int initialCapacity) {
    this(initialCapacity, null);
}

复制代码
public PriorityBlockingQueue(int initialCapacity,
Comparator

线程并发线程安全介绍及java.util.concurrent包下类介绍

线程Thread,在Java开发中多线程是必不可少的,但是真正能用好的并不多!在多线程并发则一定会带来线程安全的问题,如何解决线程安全 java.util.concurrent 是什么? java.u...
  • king866
  • king866
  • 2016年12月30日 18:59
  • 3725

Concurrent包总结——线程安全的集合操作

java中提供了丰富的集合类操作,大概可以分为无序结合Set,有序集合List和无序键值对集合Map。Java5之后又新增了队列操作集合Queue。Java1.5之后新增了线程安全的集合操作类,阻止在...
  • E01014165
  • E01014165
  • 2016年08月10日 11:27
  • 1929

java.util.concurrent包中线程安全的集合简介

一、线程安全的集合        Java中有很多支持多线程并发的集合,比如Hashtable、Vector但是这些“古老”的并发集合效率并不高,一般只支持一个线程对其进行读写(加锁是针对整张表)。从...
  • a369414641
  • a369414641
  • 2015年09月11日 14:10
  • 603

JAVA Concurrent包 中的并发集合类

我们平时写程序需要经常用到集合类,比如ArrayList、HashMap等,但是这些集合不能够实现并发运行机制,这样在服务器上运行时就会非常的消耗资源和浪费时间,并且对这些集合进行迭代的过程中不能进行...
  • bigtree_3721
  • bigtree_3721
  • 2016年05月03日 14:00
  • 1906

基于ConcurrentHashMap实现ConcurrentHashSet

我们知道,在Java中,HashMap是线程不安全的,ConcurrentHashMap并发优化的HashMap,而JDK并未提供ConcurrentHashSet。 但我们可以基于Concurren...
  • wangnan537
  • wangnan537
  • 2017年06月07日 22:19
  • 595

Concurrent多线程控制

在Java 5.0之前启动一个任务是通过调用Thread类的start()方法来实现的,任务的提于交和执行是同时进行的,如果你想对任务的执行进行调度或是控制同时执行的线程数量就需要额外编写代码来完成。...
  • zlb824
  • zlb824
  • 2011年10月27日 18:03
  • 715

线程安全的并发集合类

1.简述 实现一个线程安全的集合并不难,难的是尽可能的消除并发带来的竞争瓶颈,提升效率。 所以JDK自带的并发类的意义与技术含量在于这里。 2.List 没有通用的实现类,只有一个使用场景受限...
  • chuchus
  • chuchus
  • 2015年12月10日 16:00
  • 963

Java 集合框架分析:线程安全的集合

说明:同步集合是说它的操作是同步的,(mutative operations :add, set, and so on),但是它的组合操作的同步性要自己控制。线程安全的集合什么是线程安全在多线程环境下...
  • youyou1543724847
  • youyou1543724847
  • 2016年10月04日 18:44
  • 1102

Java多线程:线程安全和非线程安全的集合对象

一、概念: 线程安全:就是当多线程访问时,采用了加锁的机制;即当一个线程访问该类的某个数据时,会对这个数据进行保护,其他线程不能对其访问,直到该线程读取完之后,其他线程才可以使用。防止出现数据不一致或...
  • u011389474
  • u011389474
  • 2017年01月19日 12:03
  • 3167

java各种集合的线程安全

java集合的线程安全
  • glDemo
  • glDemo
  • 2015年03月26日 18:48
  • 23489
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Concurrent下的线程安全集合
举报原因:
原因补充:

(最多只允许输入30个字)