jdk1.8为什么concurrentHashMap不用Reentrantlock
时间: 2023-10-31 10:36:33 浏览: 43
在 JDK1.8 中,ConcurrentHashMap 采用了一种基于 CAS(Compare and Swap)的锁-Free 机制,避免了使用 ReentrantLock 等锁机制所带来的性能问题。具体来说,ConcurrentHashMap 内部使用了一种叫做 Segment 的结构来划分整个 Map,每个 Segment 可以看作是一个小的 HashMap,内部维护一个 HashEntry 数组,每个 HashEntry 又是一个链表结构,用于解决 Hash 冲突。在进行插入、删除、查询等操作时,只需要对对应的 Segment 进行操作,而不需要对整个 Map 进行加锁,从而实现了高并发的访问。
相关问题
jdk1.8ConcurrentHashMap使用什么加锁?
在JDK1.8中,ConcurrentHashMap并没有使用传统的锁机制来保证线程安全,而是使用了一种称为“分段锁”的机制。它把整个Map分成了多个Segment,每个Segment默认情况下都是由一个ReentrantLock来保护的,这样不同的Segment之间就可以被并发访问。在ConcurrentHashMap中,put()、remove()、get()等操作只锁定当前要操作的Segment,而不会锁定整个Map,这样就可以大大提高并发效率。同时,在JDK1.8中,ConcurrentHashMap也引入了一种新的机制,即CAS和synchronized来保证线程安全。
jdk1.8中ConcurrentHashMap的数据结构
JDK1.8版本的ConcurrentHashMap的数据结构基本上和HashMap一样,不过保证线程安全性。相对于JDK1.7版本的ReentrantLock+Segment+HashEntry,JDK1.8版本的ConcurrentHashMap只是增加了同步的操作来控制并发,使用了synchronized+CAS+HashEntry+红黑树的数据结构。其中,HashEntry是一个链表节点,用于存储键值对,红黑树则是用于优化查找效率的。这种数据结构的设计可以大大提高ConcurrentHashMap的并发能力。