java.util.concurrent 之ConcurrentHashMap

Posted GE12

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java.util.concurrent 之ConcurrentHashMap相关的知识,希望对你有一定的参考价值。

为什么要用ConcurrentHashMap

    HashMap线程不安全,而Hashtable是线程安全,但是它使用了synchronized进行方法同步,插入、读取数据都使用了synchronized,当插入数据的时候不能进行读取(相当于把整个Hashtable都锁住了,全表锁),当多线程并发的情况下,都要竞争同一把锁,导致效率极其低下。而在JDK1.5后为了改进Hashtable的痛点,ConcurrentHashMap应运而生。

ConcurrentHashMap为什么高效?

JDK1.5中的实现

    ConcurrentHashMap使用的是分段锁技术,将ConcurrentHashMap将锁一段一段的存储,然后给每一段数据配一把锁(segment),当一个线程占用一把锁(segment)访问其中一段数据的时候,其他段的数据也能被其它的线程访问,默认分配16个segment。默认比Hashtable效率提高16倍。

    ConcurrentHashMap的结构图如下(网友贡献的图,哈):


Paste_Image.png

JDK1.8中的实现

    ConcurrentHashMap取消了segment分段锁,而采用CAS和synchronized来保证并发安全。数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树
synchronized只锁定当前链表或红黑二叉树的首节点,这样只要hash不冲突,就不会产生并发,效率又提升N倍。

JDK1.8的ConcurrentHashMap的结构图如下:


Paste_Image.png

TreeBin: 红黑二叉树节点
Node: 链表节点

以上是关于java.util.concurrent 之ConcurrentHashMap的主要内容,如果未能解决你的问题,请参考以下文章

java并发包java.util.concurrent详解

并发之java.util.concurrent.atomic原子操作类包

java多线程常见类与方法之java.util.concurrent.locks

Java多线程之Lock的使用

java.util.concurrent 之ConcurrentHashMap

「java.util.concurrent并发包」之 ReentrantReadWriteLock