博客
关于我
juc-07-ConcurrentHashMap1-java7
阅读量:654 次
发布时间:2019-03-15

本文共 1764 字,大约阅读时间需要 5 分钟。

Java并发容器:从传统到现代的演进

在Java程序开发中,线程安全问题始终是一个头等重要的事项。对于数据结构的选择,传统的同步容器(如Vector、Hashtable、SynchronizedList和SynchronizedMap)虽然能够提供线程安全,但它们的性能在高并发场景下往往表现不佳。原因在于这些容器采用了“单锁”机制,对于每一个方法操作都加锁,这直接导致了大量的竞争和等待。为了应对这一问题,现代开发者通常会选择ConcurrentHashMap,它通过更智能的锁分离机制,实现了线程安全与高性能的双赢。


被淘汰的传统同步容器

Vector与Hashtable

  • 线程安全机制:所有方法都加了Synchronized锁。
  • 缺点:在高并发场景下,线程竞争激烈,效率低下。例如,HashTable的putget操作会互相阻塞,限制了并发性能。
  • HashMap的竞争风险:多线程环境下,HashMap的Entry链表容易形成循环结构,导致死循环。
  • SynchronizedList和SynchronizedMap

  • 机制:通过Collections.synchronizedListCollections.synchronizedMap将传统的List和Map容器“线程化”,其内部实现了基于锁的同步。
  • 性能问题:锁的竞争始终是性能瓶颈,所有方法均需加锁,导致并发处理能力有限。

  • ConcurrentHashMap的崛起

    核心思想:锁分离与段管理

    • 锁分离:ConcurrentHashMap采用了多个锁的方式,分别控制对不同段的修改。
    • 段管理:将整个哈希表划分为多个段,每个段内部是一个小型的哈希表,能够独立进行修改和扩容,减少锁竞争。

    ###80408686ConcurrentHashMap的API?

    • 基本操作
    • putgetcontainscontainsKeycontainsValueremoveputAllputIfAbsent
    • isEmpty:判断是否为空。
    • size:获取容器大小。
    • keySet:返回所有键的集合。
    • values:返回所有值的集合。

    Java7 ConcurrentHashMap实现原理

    构造器参数解析

  • initialCapacity:默认为16,初始化表的容量。
  • loadFactor:默认0.75,扩容阈值的计算公式为threshold = cap * loadFactor
  • concurrencyLevel:默认16,决定段的数量。
  • 构造器内部逻辑

  • 计算段数concurrencyLevel为16,则段数为16。
  • 计算初始段容量:每个段的初始容量为cap = 2,当initialCapacity超过段数时,逐步增加。
  • 创建段:默认只创建segments[0]段,其他段在需求时动态创建。

  • 放置操作:put()与putIfAbsent()

    实现关键点

  • 计算hash:采用Wang/Jenkins算法,减少冲突。
  • 确定段:通过hash值和段掩码定位段和链表位置。
  • 锁定段:使用重入锁保证每个段的操作单独进行。
  • 处理新增节点
    • 扩容判断:当前段已满,扩容为双容量,重新分布键值对。
    • 直接插入:未满,直接插入,保持链表结构。
  • 返回旧值:支持onlyIfAbsent模式,减少不必要的锁竞争。

  • 取操作:get()

    实现细节

  • 计算hash:一样使用Wang/Jenkins算法定位链表。
  • 非阻塞获取:通过无锁的get方法,减少关键路径锁。
  • 遍历链表:线性扫描,查找目标键值对。

  • 高并发中的性能表现

  • 减少锁竞争:每个段独立处理操作,减少全局锁占用。
  • 降低自旋次数:使用无锁遍历机制,提升性能。
  • 优化空字段检测:使用偏向锁减少资源占用。
  • 减少内存浪费:通过延迟初始化优化内存使用。

  • 总结

    传统同步容器通过对每个操作都加锁实现线程安全,但在高并发场景下性能令人不满意。ConcurrentHashMap通过锁分离和段管理技术,实现了线程安全与高性能的并行化。它的核心设计理念不仅解决了传统容器的性能问题,更为现代高并发应用提供了更高效的选择。

    如果您对ConcurrentHashMap在Java8中的实现更感兴趣,欢迎关注我的技术文章和视频教程,探索更加深入的实现细节!

    转载地址:http://odglz.baihongyu.com/

    你可能感兴趣的文章
    MySQLIntegrityConstraintViolationException异常处理
    查看>>
    mysqlreport分析工具详解
    查看>>
    MySQLSyntaxErrorException: Unknown error 1146和SQLSyntaxErrorException: Unknown error 1146
    查看>>
    Mysql_Postgresql中_geometry数据操作_st_astext_GeomFromEWKT函数_在java中转换geometry的16进制数据---PostgreSQL工作笔记007
    查看>>
    mysql_real_connect 参数注意
    查看>>
    mysql_secure_installation初始化数据库报Access denied
    查看>>
    MySQL_西安11月销售昨日未上架的产品_20161212
    查看>>
    Mysql——深入浅出InnoDB底层原理
    查看>>
    MySQL“被动”性能优化汇总
    查看>>
    MySQL、HBase 和 Elasticsearch:特点与区别详解
    查看>>
    MySQL、Redis高频面试题汇总
    查看>>
    MYSQL、SQL Server、Oracle数据库排序空值null问题及其解决办法
    查看>>
    mysql一个字段为空时使用另一个字段排序
    查看>>
    MySQL一个表A中多个字段关联了表B的ID,如何关联查询?
    查看>>
    MYSQL一直显示正在启动
    查看>>
    MySQL一站到底!华为首发MySQL进阶宝典,基础+优化+源码+架构+实战五飞
    查看>>
    MySQL万字总结!超详细!
    查看>>
    Mysql下载以及安装(新手入门,超详细)
    查看>>
    MySQL不会性能调优?看看这份清华架构师编写的MySQL性能优化手册吧
    查看>>