专栏首页java一日一条从源码看concurrentHashMap的线程安全

从源码看concurrentHashMap的线程安全

从JDK1.2起,就有了HashMap,正如前一篇文章所说,HashMap不是线程安全的,因此多线程操作时需要格外小心。

在JDK1.5中,伟大的Doug Lea给我们带来了concurrent包,从此Map也有安全的了。

ConcurrentHashMap具体是怎么实现线程安全的呢,肯定不可能是每个方法加synchronized,那样就变成了HashTable。

从ConcurrentHashMap代码中可以看出,它引入了一个“分段锁”的概念,具体可以理解为把一个大的Map拆分成N个小的HashTable,根据key.hashCode()来决定把key放到哪个HashTable中。

在ConcurrentHashMap中,就是把Map分成了N个Segment,put和get的时候,都是现根据key.hashCode()算出放到哪个Segment中:

测试程序:

ConcurrentHashMap中默认是把segments初始化为长度为16的数组。

根据ConcurrentHashMap.segmentFor的算法,3、4对应的Segment都是segments[1],7对应的Segment是segments[12]。

(1)Thread1和Thread2先后进入Segment.put方法时,Thread1会首先获取到锁,可以进入,而Thread2则会阻塞在锁上:

(2)切换到Thread3,也走到Segment.put方法,因为7所存储的Segment和3、4不同,因此,不会阻塞在lock():

以上就是ConcurrentHashMap的工作机制,通过把整个Map分为N个Segment(类似HashTable),可以提供相同的线程安全,但是效率提升N倍,默认提升16倍。

本文分享自微信公众号 - java一日一条(mjx_java)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-02-04

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 使用 Nginx 自己实现一个 Web 调试代理服务器

    在Hecker News中我提到过,我记录了一种我使用NGINX(一个久经考验的产品,可以迅速地反向代理)作为一个本地测试代理服务器的方法。

    哲洛不闹
  • 一个 2 年 Android 开发者的 18 条忠告

    我仍记得2014年我决定做安卓开发的那天,这是我一生中做出的最好决定之一。到现在已经有2年半了。

    哲洛不闹
  • MySQL 性能优化的最佳 20+ 条经验

    今天,数据库的操作越来越成为整个应用的性能瓶颈了,这点对于Web应用尤其明显。关于数据库的性能,这并不只是DBA才需要担心的事,而这更是我 们程序员需要去关注的...

    哲洛不闹
  • PythonWeb | 搭建单服务实现多域名访问

    最近使用Django开发一个小程序和后台管理系统 ,需要将这两个不同的项目部署到同一个服务里面,然后使用不同的域名来访问不同的项目。Django默认的只支持单服...

    叫我龙总
  • Oracle 20c 新特性:DIAGNOSTICS_CONTROL 对诊断事件的安全管控

    导读:在诊断Oracle数据库问题时,Oracle支持服务人员可能会指示您执行某些诊断操作。有些诊断操作是无害的。但是,如果不正确地执行其他操作,可能会产生不利...

    数据和云
  • 【SpringBoot专题】快速体验前言What is SpringBoot?Start SpringBoot!运行demo结束语

    在Spring 4推出来之前,我们的编码是存在一些问题,比如:大量的xml配置存在项目中,配置相当繁琐;整合第三方框架非常麻烦;开发效率和部署效率不高等问题。正...

    用户2890438
  • Windows 7 北京发布会纪实

        上周Microsoft在国贸发布Windows Phone,今天又在北京798艺术区发布令人期待的Windows 7。感谢China MVP Servi...

    ShiJiong
  • 著名社交软件惊现Bug,删除你的所有好友!

    课代表
  • swarm源码分析(4)---Scheduler和Api

    第一时间获取文章,可以关注本人公众号 月牙寂道长 yueyajidaozhang

    月牙寂道长
  • 史上最详细的XGBoost实战(下)

    作者:章华燕 编辑:田 旭 四 XGBoost 参数详解 在运行XGboost之前,必须设置三种类型成熟:general parameters,booster...

    机器学习算法工程师

扫码关注云+社区

领取腾讯云代金券