HashMap和ConcurrentHashMap

HashMap jdk 1.7 和1.8版本有何不同

1.7版本使用数组+链表的数据结构

1.8版本使用数组+链表+红黑树的结构

产生hash碰撞的时候1.7使用链表头插的方法,1.8使用链表尾插

1.8改进的原因 多线程头插法在数组扩容rehash的时候改变链表顺序可能产生环形链表,查询死循环

添加红黑树 使得链表数据多减少查询复杂度,相比于平衡二叉树 红黑树不是严格意义上的平衡二叉树,

允许局部数据的不平衡,在减少查询时间的同时也减少更新树耗时

HashMap为什么是线程不安全的

hashMap不安全是多线程put可能存在hash碰撞产生数据相互覆盖的情况

ConcurrentHashMap为什么是线程安全的

1.7 使用segment分段锁实现,每个segment中都有一个hashmap在put时使用reentrantlock加锁

每个entry都是用volatile修饰value和nextnode节点 ,保证其他线程get最新值

1.8 中使用cas+synchronized+node方式,降低了锁的颗粒度,put过程先使用cas获取锁

如果获取失败则使用排它锁synchronized阻塞线程

posted @ 2021-04-04 11:34  culater  阅读(63)  评论(0编辑  收藏  举报