zoukankan      html  css  js  c++  java
  • HashMap、Hashtable、ConcurrentHashMap的区别

    HashMap

    • 线程不安全
    • 继承自AbstractMap类
    • 允许一个NULL键和多个NULL值
    • 初始size为16 扩容:newsize = 2n

    Hashtable

    • 线程安全,它的每个方法中都加入了synchronized
    • 继承自Dictionary类
    • 不允许NULL键和NULL值
    • 初始size为11, 扩容:newsize = 2n+1
    • 实现线程安全的方式是在修改数据时锁住整个HashTable,效率低,ConcurrentHashMap做了相关优化

    ConcurrentHashMap

    • 线程安全的HashMap的实现(jdk1.5)
    • 不允许NULL键和NULL值
    • ConcurrentHashMap引入了一个"分段锁"的概念,具体可以理解为把一个大的Map拆分成N个小的Hashtable,根据key.hashCode()来决定把key放到哪个Hashtable中
    • 在ConcurrentHashMap中,就是把Map分成了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个Segment中,不用锁定整个Map,只锁定这个segment即可

    同为线程安全,Hashtable和ConcurrentHashMap有什么分别呢?

    • 它们都可以用于多线程的环境,但是当Hashtable的大小增加到一定的时候(Hashtable里使用的是synchronized关键字),性能会急剧下降,因为迭代时需要被锁定很长的时间
    • 因为ConcurrentHashMap引入了分割(segment),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等到迭代完成才能访问map
    • 简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map
  • 相关阅读:
    JS从后台获取数据,前台动态添加tr标签中的td标签
    Java方式导出EXCEL表格
    框架搭建相关博文
    Spring框架相关博文集
    Eclipse相关工具使用
    关于Spring Boot的博客集合
    Springboot spring data jpa 多数据源的配置01
    springboot1.X 到2.X 的改变
    Spring-Boot devtools项目自动重启
    JSR 303
  • 原文地址:https://www.cnblogs.com/blazeZzz/p/9959401.html
Copyright © 2011-2022 走看看