超好用的工具类:并发集合简介
ConcurrentHashMap,这是一个搞笑的并非HashMap。你可以把它理解为一个线程安全的HashMap.
CopyOnWriteArrayList,这是一个List,从名字看就知道它和ArrayList是一族的。
在读多写少的场合,这个List的性能非常号,远远优于Vector.
ConcurrentLinkedQueue,高效的并非队列,使用链表实现。可以看作一个线程安全的LinkedList.
BlockingQueue:这是一个接口,JDK内部通过链表,数组等方式实现了这个接口。
表示阻塞队列,非常适合作为数据共享的通道。
ConcurrentSkipListMap:跳表的实现。这是一个Map,使用跳表的数据结构进行快速查找。
Vector也是线程安全的,虽然性能和上述专用工具没得比。另外
Collections工具类可以帮助我们将任意集合包装成线程安全的集合。
线程安全的HashMap
如果需要一个线程安全的HashMap应该怎么做呢?一种可行的方法是使用
Collections.synchronizedMap()方法包装我们的HashMap。如下代码,产生的
HashMap就是线程安全的。
public static Map m = Collections.synchronizedMap(new HashMap());
Collections.synchronizedMap方法会生成一个名为synchronizedMap的Map.
它使用委托,将自己所有Map相关的功能交给传入的HashMap实现,
而自己则主要负责保护线程安全。
具体参考下面的实现,首先synchronizedMap内包装了一个Map。
private static class SynchronizedMap<K,V>
implements Map<K,V>,Serializable{
private static final long serialVersionUID = 121434343L;
private final Map<K,V> m;
final Object mutex;
}
通过mutex实现对这个m的互斥操作。
比如,对于Map.get()方法,它的实现如下:
public V get(Object key){
synchronized(mutex){return m.get(key);}
}
而其他所有相关的Map操作都会使用这个mutex进行同步,从而实现线程安全。
虽然这个包装的Map可以满足线程安全的要求,但是它在多线程环境中的性能表现并不算太好。
无论是对Map的读取或者写入,都需要获得mutex的锁,这会导致所有对Map
的操作全部进入等待状态,直到mutex锁可用。如果并发级别不高,那么一般也够用。
但是,在高并发环境中,我们有必要寻求新的解决方案。
一个更加专业的HashMap是ConcurrentHashMap,专门为并发进行了性能优化。因此更适合多
线程的场合。