zoukankan      html  css  js  c++  java
  • 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阻塞线程

  • 相关阅读:
    BUAA_OO_2020_Unit3 Summary
    BUAA_OO_2020_Unit2 Summary
    DataFrame的遍历
    ESMM提升CVR的论文summary
    FaceBook 关于提升CTR的论文研究
    OO终章·GRAND BATTLE
    第三单元规格作业博客总结
    OO电梯单元作业总结
    【OO多项式求导作业总结】
    提问回顾与个人总结
  • 原文地址:https://www.cnblogs.com/cu-later/p/14615859.html
Copyright © 2011-2022 走看看