Java 并发核心编程(二)

 

4Concurrent Collections(并发集合类)

保护共享数据的一个关键技术是在存储数据的类中封装同步机制。所有对数据的使用都要经过同步机制的确认使这个技术能够避免数据的不当访问。在java.util.concurrent包中有很多为并发使用情况下设计的数据结构。通常,使用这些数据结构比使用同步包装器装饰的非同步的集合的效率更高。

4.1Concurrent lists and sets

Table2 中列出了java.util.concurrent包中拥有的3个并发的ListSet实现类。

描述

CopyOnWriteArraySet

CopyOnWriteArraySet在语意上提供写时复制(copy-on-werite)的特性,对这个集合的每次修改都需要对当前数据结构新建一个副本,因此写操作发费很大。在迭代器创建的时候,会对当前数据数据结构创建一个快照用于迭代。

CopyOnWriteArrayList

CopyOnWriteArrayListCopyOnWriteArraySet类似,也是基于copy-on-write语义实现了List接口

ConcurrentSkipListSet

ConcurrentSkipListSet(在JavaSE 6新增的)提供的功能类似于TreeSet,能够并发的访问有序的set。因为ConcurrentSkipListSet是基于“跳跃列表(skip list)”实现的,只要多个线程没有同时修改集合的同一个部分,那么在正常读、写集合的操作中不会出现竞争现象。

skip list: http://blog.csdn.net/yuanyufei/archive/2007/02/14/1509937.aspx

http://zh.wikipedia.org/zh-cn/%E8%B7%B3%E8%B7%83%E5%88%97%E8%A1%A8

 

4.2Concurrent maps

Java.util.concurrent包中有个继承Map接口的ConcurrentMap的接口,ConcurrentMap提供了一些新的方法(表3)。所有的这些方法在一个原子操作中各自提供了一套操作步骤。如果将每套步骤在放在map之外单独实现,在非原子操作的多线程访问的情况下会导致资源竞争。

3ConcurrentMap的方法:

方法

描述

putIfAbsent(K key, V value) : V

如果keymap中不存在,则把key-value键值对放入map中,否则不执行任何操作。返回值为原来的value,如果key不存在map中则返回null

removeObject key, Object value) : boolean

如果map中有这个key及相应的value,那么移除这对数据,否则不执行任何操作

replace (K key, V value) : V

如果map中有这个key,那么用新的value替换原来的value,否则不执行任何操作

replace (K key, V oldValue, V newValue) : boolean

如果map中有这对key-oldValue数据,那么用newValue替换原来的oldValue,否则不执行任何操作

在表4中列出的是ConcurrentMap2个实现类

方法

描述

ConcurrentHashMap

ConcurrentHashMap提供了2种级别的内部哈希方法。第一种级别是选择一个内部的Segment,第二种是在选定的Segment中将数据哈希到buckets中。第一种方法通过并行地在不同的Segment上进行读写操作来实现并发。(ConcurrentHashMap是引入了Segment,每个Segment又是一个hashConcurrentHashMap相当于是两级Hash表,然后锁是在Segment一级进行的,提高了并发性。http://mooncui.iteye.com/blog/380884

http://www.iteye.com/topic/344876
)

ConcurrentSkipListMap

ConcurrentSkipListMapJavaSE 6新增的类)功能类似TreeMap,是能够被并发访问的排序map。尽管能够被多线程正常的读写---只要这些线程没有同时修改map的同一个部分,ConcurrentSkipListMap的性能指标和TreeMap差不多。

 

 

你可能感兴趣的:(java,多线程,数据结构,编程,Blog)