ConcurrentHashMap 是如何实现线程安全的?
时间: 2023-11-09 10:59:17 浏览: 96
第10讲 如何保证集合是线程安全的 ConcurrentHashMap如何实现高效地线程安全1
ConcurrentHashMap 是线程安全的 HashMap,它通过使用锁分段技术来实现线程安全。简单来说,ConcurrentHashMap 将整个 Map 分为许多小的段(Segment),每个段都类似于一个小的 HashMap,各自维护自己的锁。这样不同的线程可以同时访问不同的段,从而实现了线程的并发访问。在对 ConcurrentHashMap 进行更新操作时,只需要获取特定段的锁,这样其它段的数据就不会受到影响。
具体来说,在 ConcurrentHashMap 中,每个 Segment 都是一个 ReentrantLock,而在 JDK 1.8 中则改为了 synchronized 关键字。每个 Segment 中都维护了一个 HashEntry 数组,每个 HashEntry 包含键值对和指向下一个 Entry 的指针,形成一个链表。当添加元素时,首先根据 key 计算出它所应该存放的 Segment,并获取该 Segment 的锁。然后在该 Segment 中进行添加或修改操作,最后释放锁。
值得一提的是,在 JDK 1.8 中,ConcurrentHashMap 在保证线程安全的前提下,还引入了一些优化措施,如扩容时只对特定 Segment 进行扩容,而不是像之前版本那样将整个 Map 进行扩容;同时引入了一种新的数据结构 CAS-based Segment,用于替换旧版本中的 ReentrantLock。
阅读全文