zoukankan      html  css  js  c++  java
  • Java之ConcurrentHashMap

    由于工作中使用到了ConcurrentHashMap,然后查了一波资料,最后整理如下:

    1. 描述:

    ConcurrentHashMap是在Java1.5作为HashTable的替代选择新引入的,是concurrent包的重要成员。在Java1.5之前,如果想要实现一个可以在多线程和并发的程序中安全使用的Map,只能在HashTable和synchronized    Map中选择,因为HashMap并不是线程安全的。
    ConcurrentHashMap不仅是线程安全的,而且比HashTable和synchronized    Map的性能要好。相对HashTable和synchronized    Map锁住了整个Map,ConcurrentHashMap只锁住部分Map。ConCurrentHashMap允许并发的读操作,同时通过同步锁在写操作时保持数据完整性。

    2. ConcurrentHashMap在jdk6,    jdk7,    jdk8中的实现都不同

    3. concurrentHashMap引入了分割,并提供了HashTable支持的所有的功能。(分段锁)

    在concurrentHashMap中,支持多线程对Map做读操作,并且不需要任何blocking。这得益于concurrentHashMap将Map分割成了不同的部分,在执行更新操作时只锁住了一部分。
    根据默认的并发级别(concurrency    level),Map被分割成16部分,并且由不同的锁控制。即同时最多可以有16个写线程操作Map,性能的提升显而易⻅。但由于一些更新操作,如put(),remove(),putAll(),clear()只锁住操作的部分,所以在检索操作不能保证返回的是最新的结果。并且在遍历过程中,如果已经遍历的数组上的内容变化了,不会抛出ConcurrentModificationException的异常。concurrentHashMap的并发级别是16,但可以在创建concurrentHashMap时通过构造函数改变。并发级别代表着并发执行更新操作的数目,所以如果只有很少的线程会更新Map,那么建议设置一个低的并发级别。另外,concurrentHashMap还使用了ReentrantLock来对segments加锁。

    4. 小结:

    1.    ConcurrentHashMap允许并发的读和线程安全的更新操作;
    2.    在执行写操作时,ConcurrentHashMap只锁住部分的Map;
    3.    并发的更新是通过内部根据并发级别将Map分割成小部分实现的;
    4.    高的并发级别会造成时间和空间的浪费,低的并发级别在写多线程时会引起线程间的竞争;
    5.    ConcurrentHashMap的所有操作都是线程安全;
    6.    ConcurrentHashMap返回的迭代器是弱一致性,fail-safe并且不会抛出ConcurrentModificationException异常;
    7.    ConcurrentHashMap不允许null的键值;
    8.    可以使用ConcurrentHashMap代替HashMap,但ConcurrentHashMap不会锁住整个Map

  • 相关阅读:
    == 和 equals 的区别是什么?
    String 类的常用方法都有那些?
    报表工具对比选型系列—多样性数据源支持度
    报表工具选型对比系列
    报表工具选型对比系列
    web 端怎么实现套打发票、快递单等套打票据功能?
    如何集成一个第三方报表,权限怎么控制
    BI 报表工具如何与 springBoot 框架集成
    在报表中可以使用 ECharts 做图形展现吗?
    Tableau 等常见 BI 工具能集成到 java 项目中吗
  • 原文地址:https://www.cnblogs.com/miaoying/p/8029286.html
Copyright © 2011-2022 走看看