1. HashTable
  1. SynchronizedMap
  2. ConcurrentHashMap - 推荐

为了避免出现场景2的线程安全的问题,不能使用HashMap作为成员变量,要寻求使用线程安全的Map,下面来总结下有哪些线程安全的Map呢?

1、HashTable

private Map<String, Object> map = new HashTable<>();

来看看 HashTable 的源码

Untitled

HashTable 的 get/put 方法都被 synchronized 关键字修饰,说明它们是方法级别阻塞的,它们占用共享资源锁,所以导致同时只能一个线程操作 get 或者 put,而且 get/put 操作不能同时执行,所以这种同步的集合效率非常低,一般不建议使用这个集合。

2、SynchronizedMap

private Map<String, Object> map = Collections.synchronizedMap(new HashMap<String, Object>());

这种是直接使用工具类里面的方法创建 SynchronizedMap,把传入的 HashMap 对象进行了包装同步而已,来看看它的源码。