来自一个萌新的博客,记录他的成长!如有不对请指正,谢谢!

 

HashMap

HashMap是一个keyvalue结构,也是一个链表结构,线程不安全,每一个键值对又叫Entye,插入时不是胡乱插入,而是通过hash算法算出来插入在哪个位置的,(通过hashCode值做&运算,算出来的),但也会有算冲突的时候,所以采用链表结构,当发现冲突的时候,entry通过next指针向下一个节点插入他算出来的位置,采用头插法!

 

Hashmap的容量是有限的,它的负载因子为0.75,

当储存的键值对也来越多的时候(当前数组长度>=当前数组长度*0.75),

hsamap会进行resize(扩容),增加数组长度为当前长度的2次幂!

 

说他说线程不安全是因为它在并发情况下会形成带环链表,并且在下一次get时的位置刚好是在带链表区域就会造成成死锁,但要满足一下因素:

(不完全,太绕没搞明白)

  1. 多线程并发情况
  2. HashMap容量饱和进行Resize时

 

ConcurrentHashMap

上说道HashMap线程不安全,但HashTable是线程安全的,效率确实很低,因为它在进行读或者写的时候回把整个集合加锁,导致同一时间的其他操作出现阻塞!

 

ConcurrentHashMap的底层由Segment实现,他就相当HashMap,我认为可以这样理解ConcurrentHashMap就是由多个HashMap实现,但在这基础上又加了分段锁!

 

ConcurrentHashMap里面有2的N次方个Segment

 

因此在不同Segment的写入是可以并发执行的。

 

ConcurrentHashMap 和 HashMap

同一个Segment可以一写一读不会有问题,

 

ConcurrentHashMap 和 HashMap

 

但是同一Segment是不能并发写入

 

ConcurrentHashMap 和 HashMap

由此可见,ConcurrentHashMap当中每个Segment各自持有一把锁。在保证线程安全的同时降低了锁的粒度,让并发操作效率更高。

 

 

 

 

 

相关文章: