HashMap线程不安全(ConcurrentHashMap线程安全?为啥呢?)

hashmap生成的链表在jdk1.8之前是插入头部的,在jdk1.8中是插入尾部的。
至于为什么要插入到头部,因为头部最快啊,不需要遍历到尾部,直接改变就行.
还有就是插入尾部容易产生环形链表,如果条件竞争(指多个线程或者进程在读写一个共享数据时结果依赖于它们执行的相对时间的情形)发生了,可能会出现环形链表,之后当我们get(key)操作时,就有可能发生死循环。
但是在JDK1.8之后是因为加入了红黑树使用尾插法,能够避免出现逆序且链表死循环的问题。
JDK1.8使用的是数组+链表+红黑树的数据结构(当链表的深度达到8的时候,也就是默认阈值,就会自动扩容把链表转成红黑树的数据结构来把时间复杂度从O(n)变成O(nlogN)提高了效率)


HashMap和ConcurrentHashMap的区别:

1.HashMap不是线程安全的,而ConcurrentHashMap是线程安全的。

2.ConcurrentHashMap采用锁分段技术,将整个Hash桶进行了分段segment,也就是将这个大的数组分成了几个小的片段segment,而且每个小的片段segment上面都有锁存在,那么在插入元素的时候就需要先找到应该插入到哪一个片段segment,然后再在这个片段上面进行插入,而且这里还需要获取segment锁。
【HashMap线程不安全(ConcurrentHashMap线程安全?为啥呢?)】3.ConcurrentHashMap让锁的粒度更精细一些,并发性能更好。

    推荐阅读