zoukankan      html  css  js  c++  java
  • Java基础知识强化之集合框架笔记78:ConcurrentHashMap之 ConcurrentHashMap、Hashtable、HashMap、TreeMap区别

    1. Hashtable:

    (1)是一个包含单向链的二维数组,table数组中是Entry<K,V>存储,entry对象;

    (2)放入的value不能为空;

    (3)线程安全的,所有方法均用synchronized修饰;


    2. HashMap:

    (1)相当于Hashtable的升级版本;

    (2)可以放入空值;

    (3)基于hash表实现;

    (4)按插入的顺序存储;

    (5)线程不安全:因为多线程环境下,使用HashMap进行put操作会引起死循环,导致CPU利用率接近100%,所以在并发情况下不能使用HashMap

    3. ConcurrentHashMap:

    通过分析Hashtable就知道,Hashtable中的synchronized是针对整张Hash表的,即每次锁住整张表让线程独占,安全的背后是巨大的浪费,慧眼独具的Doug Lee立马拿出了解决方案----ConcurrentHashMap,也是线程安全的。

    我觉得可以理解为,ConcurrentHashMap将整个hash表分割成多个segment(桶)ConcurrentHashMap的一个segment(桶)相当于是一个Hashtable;这里ConcurrentHashMap每个segment(桶)都具备一个属于它的颗粒锁。
    ConcurrentHashMap和Hashtable主要区别就是围绕着锁的粒度以及如何锁。如图:


    4. TreeMap:

    (1)基于红黑树实现;

    (2)是有序的存储;

    (3)自己可以定义排序器;

    5. Hashtable 和 ConcurrentHashMap 的区别 ?

    相同点:

    (1)Hashtable 和 ConcurrentHashMap都是线程安全的,可以在多线程环境中运行;

    (2)key跟value都不能是null。

    不同点:

    主要是两者性能上差别

    (1)效率低下的Hashtable

    Hashtable容器使用synchronized来保证线程安全,但在线程竞争激烈的情况下Hashtable的效率非常低下。因为当一个线程访问Hashtable的同步方法时,其他线程访问Hashtable的同步方法时,可能会进入阻塞或轮询状态。如线程1使用put进行添加元素,线程2不但不能使用put方法添加元素,并且也不能使用get方法来获取元素,所以竞争越激烈效率越低。

    (2)采用锁分段技术的ConcurrentHashMap

    HashTable容器在竞争激烈的并发环境下表现出效率低下的原因是所有访问HashTable的线程都必须竞争同一把锁,那假如容器里有多把锁,每一把锁用于锁容器其中一部分数据,那么当多线程访问容器里不同数据段的数据时,线程间就不会存在锁竞争,从而可以有效的提高并发访问效率,这就是ConcurrentHashMap所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

  • 相关阅读:
    Discuz 网站移至 Ubuntu 14.04.4 LTS VPS 配置
    ubuntu的一些常用命令,测试版本:Ubuntu 12.04.5 LTS
    文本的水平对齐方式,带来的一系列问题
    庆祝我的Blog开张了,今天起和大家一起见证一款原生的富文本编辑组件FoxJsonRichView的诞生过程。
    竖直导航(一)
    测试
    第七次作业
    第六次作业
    第四次作业
    第五次作业
  • 原文地址:https://www.cnblogs.com/hebao0514/p/5701246.html
Copyright © 2011-2022 走看看