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

  • 相关阅读:
    yocto/bitbake 学习资源
    QEMU/KVM学习资源
    ubuntu 中创建和删除用户
    git 重命名本地和远程分支
    Ubuntu 上搭建 FTP 服务器
    gdb 常见用法
    git log 显示与特定文件相关的 commit 信息
    基于 qemu system mode 运行 arm 程序
    基于 qemu user mode 运行 aarch64 程序
    checking in(airport)
  • 原文地址:https://www.cnblogs.com/miaoying/p/8029286.html
Copyright © 2011-2022 走看看