1.本质上的:HashMap是线程不安全的
HashTable、ConcurrentHashMap是线程安全的
2.HashTable简单粗暴使用Sychronized进行加锁
一个HashTable实例内部只有一把锁,这就意味着只要针对这个实例进行操作,都需要先申请锁,冲突概率比较大,效率较低。
3.ConcurrentHashMap内部有多把锁
a、使用多把锁降低冲突概率
b、充分利用CAS操作,例如:size++直接基于CAS完成
c、更优化的扩容操作
HashTable的扩容是一鼓作气,某个操作插入元素后触发扩容,就得由该线程把整个hash表都完成扩容后才能算插入完毕(耗时非常久)
ConcurrentHashMap是“大事化小”,当需要扩容的时候,不会由某一次操作彻底完成扩容,而是由后续的一系列操作都需要完成扩容(每次扩容一点点)