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所使用的锁分段技术,首先将数据分成一段一段的存储,然后给每一段数据配一把锁,当一个线程占用锁访问其中一个段数据的时候,其他段的数据也能被其他线程访问。

  • 相关阅读:
    《Django By Example》第十二章(终章) 中文 翻译 (个人学习,渣翻)
    《Django By Example》第十一章 中文 翻译 (个人学习,渣翻)
    《Django By Example》第十章 中文 翻译 (个人学习,渣翻)
    《Django By Example》第九章 中文 翻译 (个人学习,渣翻)
    《Django By Example》第八章 中文 翻译 (个人学习,渣翻)
    《Django By Example》第五章 中文 翻译 (个人学习,渣翻)
    我的superui开源后台bootstrap开发框架
    LayoutInflater 总结
    Android屏幕分辨率概念(dp、dip、dpi、sp、px)
    android studio安装问题
  • 原文地址:https://www.cnblogs.com/hebao0514/p/5701246.html
Copyright © 2011-2022 走看看