concurrentHashMap概念及其原理

有的时候博客内容会有变动,首发博客是最新的,其他博客地址可能会未同步,认准https://blog.zysicyj.top

全网最细面试题手册,支持艾宾浩斯记忆法。这是一份最全面、最详细、最高质量的 java面试题,不建议你死记硬背,只要每天复习一遍,有个大概印象就行了。 https://store.amazingmemo.com/chapterDetail/1685324709017001`

ConcurrentHashMap 概念及其原理

概念

ConcurrentHashMap 是Java中提供的一个线程安全的哈希表,用于在多线程环境下实现高效的并发访问。它是java.util.concurrent包下的一个重要类,作为HashMap的一个线程安全的替代品,它通过完全不同的锁机制来实现更高的并发性能。

原理

分段锁技术

在Java 7及之前的版本中,ConcurrentHashMap采用了分段锁(Segment Locking)技术。它将数据分为一段一段存储,然后给每一段数据配一把锁。当一个线程占用锁访问其中一个段数据时,其他段的数据也能被其他线程访问。ConcurrentHashMap 默认将数据分为16个段,即默认的并发级别是16。

数据结构

ConcurrentHashMap的内部实际上是由一个个Segment数组结构组成,每个Segment本质上是一个专门的哈希表。在Segment内部,它包含了一个HashEntry数组,每个HashEntry是一个链表结构,用于解决哈希冲突。

锁的细化

在Java 8中,ConcurrentHashMap的实现摒弃了Segment的概念,而是进一步细化了锁的粒度。Java 8的ConcurrentHashMap使用了Node数组+链表+红黑树的数据结构。当链表长度超过一定阈值(TREEIFY_THRESHOLD,默认为8)时,链表会转换为红黑树,以减少搜索时间。

CAS操作

ConcurrentHashMap大量使用了比较并交换(Compare-And-Swap,CAS)操作来更新其内部结构,这是一种无锁的更新机制,可以减少锁的使用,从而提高并发性能。CAS操作是利用了处理器提供的原子性指令来实现的。

synchronized关键字

尽管ConcurrentHashMap尽量减少锁的使用,但在某些情况下,如Node数组扩容时,还是需要通过synchronized关键字来保证线程安全。

总结

ConcurrentHashMap是一个为并发设计的键值对集合,它通过分段锁技术、CAS操作和锁的细化来提供高效的并发访问。在Java 8及以后的版本中,它通过更加精细化的锁和数据结构优化,进一步提高了并发性能。

最后更新于