HashTable
- HashTable是线程安全的,内部给关键方法直接加上synchronized实现同步(相当于给this加锁)
- HashTable不允许键或值为null
- HashTable是历史遗留问题,现在通常使用HashMap 或者 ConcurrentHashMap来代替
HashMap
- HashMap不是线程安全,在单线程环境下使用更佳
- 允许一个null键和多个null值
ConcurrentHashMap
- ConcurrentHashMap 把一个全局的大锁,改进成了每个链表独立的一把小锁,减少了锁冲突的概率
- 充分利用到了 CAS(比较和交换)特性,把一些不必要的加锁环节省略了。比如,使用原子操作(CAS)记录表中元素个数的变化
- 针对读操作没有加锁,读和读之间、读和写之间都不会有锁竞争,写和写之间需要加锁
- ConcurrentHashMap 在扩容时,分多次完成数据的拷贝
- 不允许null键或值