ConcurrentHashMap 和 Hashtable 的区别?

ConcurrentHashMap 和 Hashtable 的区别主要体现在实现线程安全的⽅式上不同。

  • 底层数据结构:

    • ConcurrentHashMap
      • JDK 1.7:ConcurrentHashMap 底层采⽤分段的数组+链表实现
      • JDK1.8 : ConcurrentHashMap 底层采⽤采⽤的数据结构跟 HashMap1.8 的结构⼀样,数组+链表/红⿊⼆叉树
    • Hashtable: Hashtable 和 JDK1.8 之前的 HashMap 的底层数据结构类似都是采⽤ 数组+链表 的形式,数组是 HashMap 的主体,链表则是主要为了解决哈希冲突⽽存在的
  • 实现线程安全的方式:

    • ConcurrentHashMap:
      • JDK 1.7: ConcurrentHashMap 对整个桶数组进⾏了分割分段( Segment ,分段锁),每⼀把锁只锁容器其中⼀部分数据,多线程访问容器⾥不同数据段的数据,就不会存在锁竞争,提⾼并发访问率。
      • JDK 1.8: Node 数组+链表+红⿊树的数据结构来实现,并发控制使⽤ synchronized 和 CAS 来操作。
    • HashTable (同⼀把锁) : 使⽤ synchronized 来保证线程安全,效率⾮常低下。当⼀个线程访问同步⽅法时,其他线程也访问同步⽅法,可能会进⼊阻塞或轮询状态,如使⽤ put 添加元素,另⼀个线程不能使⽤ put 添加元素,也不能使⽤ get,竞争会越来越激烈效率越低。

    数据结构: