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:分片