我是靠谱客的博主 平常猎豹,最近开发中收集的这篇文章主要介绍Java 集合之ConcurrentHashMap使用注意事项,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

Java 集合之ConcurrentHashMap使用注意事项

    • 高并发场景下的其他哈希式集合
      • HashTable
      • HashMap
      • ConcurrentHashMap 设计
        • ConcurrentHashMap在JDK8之前的设计
        • ConcurrentHashMap在JDK11的设计
      • ConcurrentHashMap 使用注意事项

考虑到线程并发安全性,ConcurrentHashMap 是比HashMap 更推荐的一种哈希式集合。

JDK8 对ConcurrentHashMap 进行了脱胎换骨式的改造,使用了大量的lock-free技术来减轻因锁的竞争而对性能造成的影响。

它是学习并发编程的一个绝佳示例。 此类超过6300行代码,涉及volatile ,CAS,锁,链表,红黑树等众多知识点。

高并发场景下的其他哈希式集合


HashTable

HashTalbe 是JDK 1.0 引入的哈希式集合,以全互斥方式处理并发情况,性能极差。

已废弃,不推荐使用。

HashMap

HashMap 是JDK1.2 引入的,非线程安全的,最大问题是并发写的时候,容易出现死链问题。

ConcurrentHashMap 设计

ConcurrentHashMap 是JDK5 引入的线程安全的哈希式集合。


ConcurrentHashMap在JDK8之前的设计

JDK8 之前采用分段锁的设计理念,相当于HahsTable和HashMap折中版本,是效率和一致性权衡后的结果。分段锁是由内部类Segment 实现的,它继承自ReentrantLock,用来管辖它辖区的各个HashEntry。

我们可以理解成 ConcurrentHashMap 被Segment 分成了很多小区,Segment 就相当于小区保安,HashEntry列表相当于小区业主,小区保安通过加锁的方式,保证每个Segment 内部不发生冲突。

ConcurrentHashMap在JDK11的设计

JDK11 对JDK7 下的ConcurrentHashMap 做了如下优化:

  • 取消分段锁机制,进一步降低冲突概率。
  • 引入红黑树结构
  • 使用了更加优化的方式统计集合内的元素数量

ConcurrentHashMap 使用注意事项

  • 当某个槽内的元素增加到8个且table的容量大于或等于64的时候,由链表转为红黑树。
  • 当某个槽内的元素个数减少到6个时,由红黑树重新转回链表。
  • 链表转化为红黑树的过程,就是把给定顺序的元素构造成一颗红黑树的过程。
  • 注意的是,当table 的容量小于64时,只会扩容并不会把链表转化为红黑树。

最后

以上就是平常猎豹为你收集整理的Java 集合之ConcurrentHashMap使用注意事项的全部内容,希望文章能够帮你解决Java 集合之ConcurrentHashMap使用注意事项所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(39)

评论列表共有 0 条评论

立即
投稿
返回
顶部