目录
2.1、HashTable锁粒度粗,ConcurrentHashMap锁粒度细
2.2、ConcurrentHashMap只有写操作加锁,读操作不加锁
2.3、ConcurrentHashMap充分利用了CAS特性
2.4、ConcurrentHashMap和HashTable的扩容方式也不一样
2.5、HashMap key允许为null,其他两个都不可以
回答思路
先考虑线程安全,再考虑锁粒度,多线程下的优化;
一、线程安全角度
HashMap本身不是线程安全的,多线程下更多的使用是HashTable,ConcurrentHashMap;
HashTable只是在关键方法上加了synchronized,相当于针对HashTable本身加锁;ConcurrentHashMap相对于HashTable做出了一些优化和改进:对读方式没有加锁(但使用了volatile保证从内存中读取数据),只对写操作使用synchronized进行加锁,但不是对整个对象进行加锁,而是对每个哈希桶进行加锁;(如下图)