ConcurrentHashMap和HashTable类似,但加锁方式不同

HashTable是锁住整个map

ConcurrentHashMap的基本思想是采取分块的方式加锁,分块数由参数“concurrencyLevel”来决定(和HashMap中的“initialCapacity”类似,实际块数是第一个大于concurrencyLevel的2的n次方)。每个分块被称为Segment,Segment的索引方式和HashMap中的Entry索引方式一致(hash值对数组长度取模)。

对Segment加锁的方式很简单,直接把Segment定义为ReentrantLock的子类。

static final class Segment<K,V> extends ReentranceLock implements Seriable{}

Segmentk可以看出一个特定实现的HashTable

sieze():

  Segment里的全局变量count是一个volatile变量,在累加count操作过程中,之前累加过的count发生变化的几率非常小,所以ConcurrentHashMap的做法是先尝试2次通过不锁住Segment的方式来统计各个Segment大小,如果统计的过程中,容器的count发生了变化,则再采用加锁的方式来统计所有Segment的大小

  ConcurrentHashMap通过modCount变量判断容器是否发生变化,在put , remove和clean方法里操作元素前都会将变量modCount进行加1,那么在统计size前后比较modCount是否发生变化,从而得知容器的大小是否发生变化

转载于:https://www.cnblogs.com/zawjdbb/p/7256071.html

Concurrent实现原理相关推荐

  1. 大佬对协程以及try except的详细解释

    协程中提到的异步指的是两个函数一起运行,各个函数运行到哪里cpu会中断是不一定的. ---------------------------------------------------------- ...

  2. 网易考拉海购Java开发面经(已拿offer)

    2019独角兽企业重金招聘Python工程师标准>>> 网易的面试是在8月23日进行的,说是三面,但hr面的时候面了两次,后来得知好像是主管面,所以实际上是四次面试,两轮技术面+主管 ...

  3. linux查cpu和内存配置,Linux查看CPU和内存的配置信息

    CPU配置信息: frank@ubuntu:~/test/python$ cat /proc/cpuinfo processor : #系统中逻辑处理核的编号 vendor_id : GenuineI ...

  4. react map循环生成的button_【第1945期】彻底搞懂React源码调度原理(Concurrent模式)...

    前言 估计会懵逼.今日早读文章由成都@苏溪云投稿分享. 正文从这开始~~ 最早之前,React还没有用fiber重写,那个时候对React调度模块就有好奇.而现在的调度模块对于之前没研究过它的我来说更 ...

  5. java.util.concurrent.Exchanger应用范例与原理浅析--转载

    一.简介    Exchanger是自jdk1.5起开始提供的工具套件,一般用于两个工作线程之间交换数据.在本文中我将采取由浅入深的方式来介绍分析这个工具类.首先我们来看看官方的api文档中的叙述: ...

  6. java.util.concurrent.Exchanger应用范例与原理浅析

    http://www.cnblogs.com/davidwang456/p/4179488.html Exchanger是自jdk1.5起开始提供的工具套件,一般用于两个工作线程之间交换数据.在本文中 ...

  7. 转:AbstractQueuedSynchronizer的介绍和原理分析

    引自:http://ifeve.com/introduce-abstractqueuedsynchronizer/ 简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同 ...

  8. java.util.concurrent包API学习笔记

    newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束, ...

  9. java fork join原理_细说Fork/Join框架

    什么是Fork/Join框架? Fork/Join框架是JDK1.7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干小任务,最终汇总每个小任务结果后得到大任务结果的框架.Fork就是把一个大 ...

最新文章

  1. Android实现RecyclerView侧滑删除和长按拖拽-ItemTouchHelper
  2. 如何判断 ios设备的类型(iphone,ipod,ipad)
  3. linux系统下替换图片,Linux(ubuntu系统)下使用FreeImage库
  4. golang中,new和make的区别
  5. Linux sgid功能
  6. python基础数据类型操作系统_python基础数据类型
  7. windows查看dll接口
  8. mysql workbench中文设置 mac系统,win系统,linux系统
  9. 教你打通 Git 任督二脉
  10. tpl-spring-mybatis 模板工程
  11. as 插件GsonFormat用法(json字符串快速生成javabean)
  12. linux 网络编程connection refused,《UNIX网络编程》第一个例子出现“connect error: Connection refused”错误提示信息?...
  13. QA视角看数据匿名化
  14. 如何高效学习,斯科特·扬(全文)
  15. 深挖AI价值与温度,AETA地震预测AI算法大赛开启
  16. 北京智源大会 | AI + 医疗的下一个十年:从公共卫生预警到人类基因密码破解 道翰天琼认知智能api机器人接口1。
  17. 计算机组装手机app,智能手机安装软件的
  18. Opencv中,椭圆拟合后,得到该椭圆方程系数。
  19. 使用avue图标选择器出现图标无法显示解决
  20. 王者荣耀自动化获取金币/经验周上限 教程

热门文章

  1. 12位18Bb20计算公式c语言,C语言的一些简单题目,没有答案,哪位大神帮忙做一下!!!...
  2. 产品小白的知识点1——用户周期
  3. python的分支结构
  4. js声明变量的三种方式
  5. 18-switch语句
  6. nginx、uwsgi部署django项目理论+实战
  7. SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)
  8. activity(流程引擎)从零入门到实战学习
  9. 一步一步理解GB、GBDT、xgboost
  10. 深入理解ElasticSearch(八):索引管理