ConcurrentHashMap 实现原理概述

ConcurrentHashMap 实现原理

  • HashMap 是非线程安全的,HashTable 是线程安全的,在不考虑性能问题的时候,多线程下可以使用 Hashtable 与 Collections.synchronizedMap(),这两种方式基本都是对整个 hash 表结构做锁定操作,这表明在锁定期间别的线程就需要等待,无疑性能不高,HashTable 容器在竞争激烈的并发环境下效率低下,因为所有访问 HashTable 的线程都必须竞争同一把锁
  • ConcurrentHashMap 使用锁分段技术,将数据分成一段一段的存储,给每一段数据配置一把锁,当一个线程占用锁访问其中一段数据时,其他段的数据也能被其它线程访问
  • 但有些方法需要跨段,如 size() 它可能需要锁定整个表而不是仅仅某个段,这需要按顺序锁定所有段,操作完毕后又按顺序锁定所有段的锁

《ConcurrentHashMap 实现原理概述》
ConcurrentHashMap结构

  • ConcurrentHashMap 是由 Segment 数组结构和 HashEntry 数组结构组成:
    • Segment 是一种 ReentrantLock
    • HashEntry 用于存储键值对数据
  • 一个 ConcurrentHashMap 里包含一个 Segment 数组,Segment 的结构与 HashMap 类似,是一种链表散列数据结构,一个 Segment 包含一个 HashEntry 数组,每个 HashEntry 是一个链表结构的元素
  • 每个 Segment 维护着一个 HashEntry 数组里的元素,当要对 HashEntry 的数据进行修改时,就必须先获得对应的 Segement 锁
    原文作者:林塬
    原文地址: https://www.jianshu.com/p/8be1d44f92d3
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞