Concurrent实现原理
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实现原理相关推荐
- 大佬对协程以及try except的详细解释
协程中提到的异步指的是两个函数一起运行,各个函数运行到哪里cpu会中断是不一定的. ---------------------------------------------------------- ...
- 网易考拉海购Java开发面经(已拿offer)
2019独角兽企业重金招聘Python工程师标准>>> 网易的面试是在8月23日进行的,说是三面,但hr面的时候面了两次,后来得知好像是主管面,所以实际上是四次面试,两轮技术面+主管 ...
- linux查cpu和内存配置,Linux查看CPU和内存的配置信息
CPU配置信息: frank@ubuntu:~/test/python$ cat /proc/cpuinfo processor : #系统中逻辑处理核的编号 vendor_id : GenuineI ...
- react map循环生成的button_【第1945期】彻底搞懂React源码调度原理(Concurrent模式)...
前言 估计会懵逼.今日早读文章由成都@苏溪云投稿分享. 正文从这开始~~ 最早之前,React还没有用fiber重写,那个时候对React调度模块就有好奇.而现在的调度模块对于之前没研究过它的我来说更 ...
- java.util.concurrent.Exchanger应用范例与原理浅析--转载
一.简介 Exchanger是自jdk1.5起开始提供的工具套件,一般用于两个工作线程之间交换数据.在本文中我将采取由浅入深的方式来介绍分析这个工具类.首先我们来看看官方的api文档中的叙述: ...
- java.util.concurrent.Exchanger应用范例与原理浅析
http://www.cnblogs.com/davidwang456/p/4179488.html Exchanger是自jdk1.5起开始提供的工具套件,一般用于两个工作线程之间交换数据.在本文中 ...
- 转:AbstractQueuedSynchronizer的介绍和原理分析
引自:http://ifeve.com/introduce-abstractqueuedsynchronizer/ 简介 提供了一个基于FIFO队列,可以用于构建锁或者其他相关同步装置的基础框架.该同 ...
- java.util.concurrent包API学习笔记
newFixedThreadPool 创建一个固定大小的线程池. shutdown():用于关闭启动线程,如果不调用该语句,jvm不会关闭. awaitTermination():用于等待子线程结束, ...
- java fork join原理_细说Fork/Join框架
什么是Fork/Join框架? Fork/Join框架是JDK1.7提供的一个用于并行执行任务的框架,是一个把大任务分割成若干小任务,最终汇总每个小任务结果后得到大任务结果的框架.Fork就是把一个大 ...
最新文章
- Anchor的泛化:统一物体检测、实例分割、姿态估计的Point-set Anchor
- linux系统启动流程详解
- javaweb:Cookie
- 关于文件格式和编码方式,乱码产生的原因?
- 1.VMware安装3个ubuntu14.05
- 计划学习研究模板引擎。学习stringtemplate先
- CSS3 经典教程系列:CSS3 圆角(border-radius)详解
- 深入理解Java类加载机制
- ACM常用之 异或运算的性质。
- 《刻意练习》到底讲了些什么???
- ubuntu修改服务器端,修改ubuntu 服务器配置
- 工作了五年才明白的道理,这些原来我一开始就做错了
- 如何断开所有SQL Server所有的连接
- kubernetes 查看pod在哪个node节点运行
- 快速对表的某字段赋递增的数值
- redis数据库的简单使用
- 数据结构 图论02 十字链表详解 代码
- 66个史上最全的行业数据研报网站
- 用c语言编程小鸭子,小鸭子
- 库存控制系统(inventory control system)