目录
从底层数据结构来看
ConcurrentHashMap
JDK1.8以前采用分段数组+链表实现
JDK1.8以后采用数组+链表+红黑树实现。
Hashtable
采用数组+链表。
从实现线程安全的方式上看
ConcurrentHashMap
在JDK1.8以前对整个桶数组进行了分段,每一个锁只锁其中的一部分数据,多线程访问容器中不同数据段的数据,就不会存在锁竞争,提高并发访问率。
在JDK1.8以后使用Node数组+链表+红黑树的数据结构实现,并发控制使用synchronized和CAS(比较并替换)实现。
Hashtable
使用synchronized来保证线程安全,效率较低。当一个线程访问同步方法时,其他线程也访问同步方法,可能会进入阻塞或者轮询状态。