• java并发编程笔记(十)——HashMap与ConcurrentHashMap


    java并发编程笔记(十)——HashMap与ConcurrentHashMap

    HashMap参数

    有两个参数影响他的性能

    • 初始容量(默认为16)
    • 加载因子(默认是0.75)

    HashMap寻址方式

    对一个我们需要插入的数据或者我们要读取的数据,首先hashMap会将它的key按照一定的计算规则计算出的hash值并对我们的数组长度进行取模,结果作为插入数组织位置的index.

    在计算中,取模的代价远远高于位移的代价,因此hashMap要求数组的长度一定是2的n次方;此时它将key的hash值对2的(n-1)次方进行与运算,它的结果与我们的取模操作是相同的,hshMap在初始化的时候,并不要求用户一定传入一个2的n次方的整数,而是根据传入的值,计算出一个满足2的n次方的容量。

    hashMap不安全的原因

    • 在hash进行resize的时候,容易出现死循环

    • 以及在使用迭代器的时候 容易发生fast-fail

      fast-fail :

      fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。

    ConcurrentHashMap

    concurrentHashMap与HashMap不同的是,底层的最外层不是一个一个大的数组,而是一个Segment数组,每个Segment数组包含一个跟hashMap差不多的链表。Segment继承自ReetrentLock,所以Segment能够很方便的对数组进行上锁。

    Segment:分片

  • 相关阅读:
    Lua 学习之基础篇七<Lua Module,Package介绍>
    Lua 学习之基础篇六<Lua IO 库>
    Lua 学习之基础篇五<Lua OS 库>
    Lua 学习之基础篇四<Lua table(表)>
    Lua 学习之基础篇三<Lua 字符串操作>
    时空穿梭
    【集训队作业】line
    动态几何问题
    博弈论与概率统计
    wombats
  • 原文地址:https://www.cnblogs.com/xujie09/p/11706658.html
Copyright © 2020-2023  润新知