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阻塞线程