微信公众号:路人zhang
网站救助计划

1.为阅读体验,本站无任何广告,也无任何盈利方法,站长一直在用爱发电,现濒临倒闭,希望有能力的同学能帮忙分担服务器成本


2.捐助10元及以上同学,可添加站长微信lurenzhang888,备注捐助网站倒闭后可联系站长领取本站pdf内容


3.若网站能存活下来,后续将会持续更新内容

当前位置: Java > Java并发高频面试题 > 58.ConcurrentHashMap在JDK1.7和JDK1.8版本中的区别?
  • 实现结构上的不同,JDK1.7是基于Segment实现的,JDK1.8是基于Node数组+链表/红黑树实现的。
  • 保证线程安全方面:JDK1.7采用了分段锁的机制,当一个线程占用锁时,会锁住一个Segment对象,不会影响其他Segment对象。JDK1.8则是采用了CAS和synchronize的方式来保证线程安全。
  • 在存取数据方面:
    • JDK1.7中的put()方法:
      • 先计算出keyhash值,利用hash值对segment数组取余找到对应的segment对象。
      • 尝试获取锁,失败则自旋直至成功,获取到锁,通过计算的hash值对hashentry数组进行取余,找到对应的entry对象。
      • 遍历链表,查找对应的key值,如果找到则将旧的value直接覆盖,如果没有找到,则添加到链表中。(JDK1.7是插入到链表头部,JDK1.8是插入到链表尾部,这里可以思考一下为什么这样)
    • JDK1.8中的put()方法:
      • 计算key值的hash值,找到对应的Node,如果当前位置为空则可以直接写入数据。
      • 利用CAS尝试写入,如果失败则自旋直至成功,如果都不满足,则利用synchronized锁写入数据。

本站链接:https://www.mianshi.online如需勘误或投稿,请联系微信:lurenzhang888


点击面试手册,获取本站面试手册PDF完整版