[Java 多线程] 并发集合类

转载 2011年01月24日 18:38:00

ConcurrentHashMap
JDK 1.5 中的java.util.concurrent 包是对Map 的线程安全的实现,比起synchronizedMap 来,他提供的并发性要好的多。可以同时的(并发的)执行读写操作。
ConcurrentHashMap 被设计用来优化检索操作,实际上,成功的get() 操作完成后,通常根本不会有锁着的资源。
ConcurrentHashMap 通过稍微的松弛他对调用者的承诺而获得了更高的并发性。检索操作将可以返回由最近完成的插入操作所插入的值,也可以返回在步调上是并发的插入操作所添加的值。由ConcurrentHashMap.iterator() 返回的Iterators 将每次最多返回一个元素,并且不会抛出ConcurrentmodificationException 异常,但是可能会也可能不会反映在该迭代器被构建之后发生的插入操作或者移除操作。在对集合迭代时,不需要集合范围的锁就能提供线程安全。
在任何不依赖锁整个表来防止更新的应用程序中,可以使用ConcurrentHashMap 来代替synchronizedMap 或 Hashtable。

CopyOnWriteArrayList
在那些遍历操作大大地多于插入或移除操作的并发应用程序中,一般用CopyOnWriteArrayList 类代替ArrayList。
如果你正在使用一个普通的ArrayList 来存放一个监听器列表,那么只要该列表示可变的,且可能被多线程访问,你就必须要么在对其迭代操作期间,要么在迭代前进行的克隆操作期间,锁定整个列表,这两种方法的开销多很大。当对列表执行会引起列表发生变化的操作时,CopyOnWriteArrayList 并不是为列表创建一个全新的副本,它的迭代器肯定能够返回在迭代器被创建时列表的状态,而不会抛出 ConcurrentModificationException 。在对列表进行迭代之前不必克隆列表或者在迭代期间锁定列表,因为迭代器所看到的列表的副本是不变的。换句话说, CopyOnWriteArrayList 含有对一个不可变数组的一个可变的引用,因此,只要保留好那个引用,您就可以获得不可变的线程安全性的好处,而且不用锁定列表。

 

总结:

同步的集合类 Hashtable 和 Vector ,以及同步的包装器类 Collections.synchronizedMap 和 Collections.synchronizedList ,为 Map 和 List 提供了基本的有条件的线程安全的实现。然而,某些因素使得它们并不适用于具有高度并发性的应用程序中――它们的集合范围的单锁特性对于可伸缩性来说是一个障碍,而且,很多时候还必须在一段较长的时间内锁定一个集合,以防止出现ConcurrentModificationExceptions异常。 ConcurrentHashMap 和 CopyOnWriteArrayList 实现提供了更高的并发性,同时还保住了线程安全性,只不过在对其调用者的承诺上打了点折扣。 ConcurrentHashMap 和 CopyOnWriteArrayList 并不是在您使用HashMap 或 ArrayList 的任何地方都一定有用,但是它们是设计用来优化某些特定的公用解决方案的。许多并发应用程序将从对它们的使用中获得好处。

 

本文摘自: Java 理论与实践: 并发集合类

Java多线程-并发中的集合详解

参考:http://www.cnblogs.com/dolphin0520/p/3938914.html 多线程并发中的集合 一、Map 1、ConcurrentHashMap (1) 对HashTa...
  • Love_JavaProgram
  • Love_JavaProgram
  • 2015年12月27日 19:28
  • 1798

java中的并发集合类概述

一,普通集合类中线程安全的集合:Vector  && Stack 1,Vector: (1)默认分配初始大小为10的数组,在构造方法中可以指定数组初始大小和增长大小。 (2)线程安全主要是通过在...
  • xiaye1989
  • xiaye1989
  • 2015年11月23日 20:08
  • 1926

java中并发集合

在 Java 编程的早期阶段,位于 Oswego 市的纽约州立大学(SUNY) 的一位教授决定创建一个简单的库,以帮助开发人员构建可以更好地处理多线程情况的应用程序。这并不是说用现有的库就不能实现,但...
  • qq_14926159
  • qq_14926159
  • 2016年05月08日 12:44
  • 1787

java并发系列——并发集合(一)

在编程语言中,数据结构是一种能为计算机提供数据存储的元素,在java语言中,提供了集合框架,实现不同类型的数据结构的属性,类和接口等,可以应用于程序中。 在并发编程中,常用的大多数集合并不适用,因为...
  • xhwwc110
  • xhwwc110
  • 2016年01月18日 00:31
  • 952

JAVA Concurrent包 中的并发集合类

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

专用于高并发的map类-----Map的并发处理(ConcurrentHashMap)

oncurrentModificationException 在这种迭代方式中,当iterator被创建后集合再发生改变就不再是抛出ConcurrentModificationException...
  • dingxingmei
  • dingxingmei
  • 2014年12月17日 14:34
  • 8934

java基础复习(集合、泛型、IO流、多线程、Junit 、内省 、Properties、 路径问题)

集合---|Collection: 单列集合 ---|List: 有存储顺序, 可重复 ---|ArrayList: 数组实现, 查找快, 增删慢 ...
  • guanhang89
  • guanhang89
  • 2016年04月25日 11:29
  • 4281

Java基础总结(二)----集合、多线程、io、虚拟机等

Java集合java集合框架的结构List接口List接口通常表示一个列表(数组、队列、链表、栈等),其中的元素可以重复,常用实现类为ArrayList和LinkedList,另外还有不常用的Vect...
  • wgyscsf
  • wgyscsf
  • 2017年04月04日 22:32
  • 1658

回顾总结一下JDK高并发的包(集合、多线程、锁)

1、java 高并发包所采用的几个机制(CAS,volatile,抽象队列同步)    CAS(乐观操作),jdk5以前采用synchronized,对共享区域进行同步操作,synchronized...
  • yangbutao
  • yangbutao
  • 2013年01月19日 20:32
  • 6931

java集合深入学习--并发集合

CopyOnWriteArrayList/CopyOnWriteArraySet——几乎不更新,通常只做遍历 ArrayBlockingQueue——带边界的阻塞式队列 ConcurrentLinke...
  • yxinzju
  • yxinzju
  • 2015年08月24日 19:46
  • 1147
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[Java 多线程] 并发集合类
举报原因:
原因补充:

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