5分钟理解ConcurrentHashMap的原理和应用场景

ConcurrentHashMap的应用场景

因为多线程环境下,使用Hashmap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap。
ConcurrentHashMap是J.U.C包里面提供的一个线程安全并且高效的HashMap,所以ConcurrentHashMap在并发编程的场景中使用的频率比较高。

ConcurrentHashMap源码分析:

ConcurrentHashMap和HashMap的实现原理是差不多的,但是因为ConcurrentHashMap需要支持并发操作。JDK1.7和Jdk1.8版本也有变化。

先说说1.7版本:
1.7 的时候,ConcurrentHashMap 采用了分段锁技术, ConcurrentHashMap是一个Segment数组,segment里面是多个HashEntry,Segment 它通过继承ReentrantLock来进行加锁,通过每次锁住一个segment来保证每个segment内的操作的线程安全性从而实现全局线程安全。所以底层还是 数组+链表结构。

1.7结构图:
在这里插入图片描述

1.8版本:
1.7版本解决了并发的问题,但是依然有 查询遍历链表效率太低的问题。
因此 1.8 做了一些数据结构上的调整。抛弃了原有的 Segment 分段锁,而采用了 CAS + synchronized 来保证并发安全性。也将 1.7 中存放数据的 HashEntry 改为 Node,但作用都是相同的。其中的 val next 都用了 volatile 修饰,保证了可见性。
底层数据结构采用:数组+链表+红黑树.

采用红黑树之后可以保证查询效率(O(logn)),甚至取消了 ReentrantLock 改为了 synchronized.

1.8结构图:
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_43978695/article/details/109789323
今日推荐