- HashTable
为了避免出现场景2的线程安全的问题,不能使用HashMap作为成员变量,要寻求使用线程安全的Map,下面来总结下有哪些线程安全的Map呢?
private Map<String, Object> map = new HashTable<>();
来看看 HashTable 的源码
HashTable 的 get/put 方法都被 synchronized 关键字修饰,说明它们是方法级别阻塞的,它们占用共享资源锁,所以导致同时只能一个线程操作 get 或者 put,而且 get/put 操作不能同时执行,所以这种同步的集合效率非常低,一般不建议使用这个集合。
private Map<String, Object> map = Collections.synchronizedMap(new HashMap<String, Object>());
这种是直接使用工具类里面的方法创建 SynchronizedMap,把传入的 HashMap 对象进行了包装同步而已,来看看它的源码。