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

超好用的工具类:并发集合简介
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
  implements Map,Serializable{
  private static final long serialVersionUID = 121434343L;
  
  private final Map 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,专门为并发进行了性能优化。因此更适合多
  线程的场合。

超好用的工具类:并发集合简介--线程安全的HashMap_第1张图片

你可能感兴趣的:(java,开发语言)