Java并发编程之——并发集合
并发集合是原有集合框架的补充,为多线程并发程序提供了支持。主要有:BlockingQueue,ConcurrentMap,ConcurrentNavigableMap三个接口。
新的java.util.concurrent包可用的具体集合类中加入了BlockingQueue接口和5个阻塞队列类。阻塞队列实质上就是一种有点扭曲的FIFO数据结构,不是立即从队列中添加或删除元素,线程执行操作被阻塞,直到有空间或元素可用。生产者中 put()操作会在没有空间可用时阻塞,而消费者的take()操作会在队列中没有任何东西时阻塞。
五个队列所提供的各有不同:
ArrayBlockingQueue :一个由数组支持的有界队列。
LinkedBlockingQueue :一个由链接节点支持的可选有界队列
PriorityBlockingQueue :一个由优先级堆支持的无界优先队列,它利用所包含元素的 Comparable 排序顺序来以逻辑顺序维护元素。可以将它看作TreeSet的替代物
DelayQueue :一个由优先级堆支持的、基于时间的调度队列。
SynchronousQueue :一个利用 BlockingQueue 接口的简单聚集(rendezvous)机制。
使用 ConcurrentMap 实现类java.util.concurrent.ConcurrentMap 接口和 ConcurrentHashMap实现类只能在键不存在时将元素加入到map中,只有在键存在并映射到特定值时才能从map中删除一个元素。主要定义了以下几个方法:
V putIfAbsent(K key,V value):如果指定键已经不再与某个值相关联,则将它与给定值 关联。boolean remove(Object key,Object value):只有目前将键的条目映射到给定值时,才移除 该键的条目。
boolean replace(K key,V oldValue,V newValue):只有目前将键的条目映射到给定值时, 才替换该键的条目。ConcurrentMap中定义的方法是原子性的
CopyOnWriteArrayList 和 CopyOnWriteArraySet:
对于新的 CopyOnWriteArrayList 和 CopyOnWriteArraySet 类,所有可变的(mutable)操作都首先取得后台数组的副本,对副本进行更改,然后替换副本。这种做法保证了在遍历自身可更改的集合时,永远不会抛出ConcurrentModificationException.遍历集合会用原来的集合完成,而在以后的操作中使用更新后的集合。