超好用的工具类:并发集合简介--线程安全的HashMap

本文介绍了Java中用于并发场景的几种重要工具类,如ConcurrentHashMap、CopyOnWriteArrayList、ConcurrentLinkedQueue等,以及如何通过Collections.synchronizedMap实现线程安全的HashMap,同时强调了ConcurrentHashMap在高并发环境中的性能优势。

超好用的工具类:并发集合简介
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,专门为并发进行了性能优化。因此更适合多
  线程的场合。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值