ConcurrentHashMap的size操作
2017-07-23 14:50
225 查看
如果我们要统计整个ConcurrentHashMap里元素的大小,就必须统计所有Segment里元素的大小后求和。Segment里的全局变量count是一个volatile变量,那么在多线程场景下,我们是不是直接把所有Segment的count相加就可以得到整个ConcurrentHashMap大小了呢?不是的,虽然相加时可以获取每个Segment的count的最新值,但是拿到之后可能累加前使用的count发生了变化,那么统计结果就不准了。所以最安全的做法,是在统计size的时候把所有Segment的put,remove和clean方法全部锁住,但是这种做法显然非常低效。
因为在累加count操作过程中,之前累加过的count发生变化的几率非常小,所以ConcurrentHashMap的做法是先尝试2次通过不锁住Segment的方式来统计各个Segment大小,如果统计的过程中,容器的count发生了变化,则再采用加锁的方式来统计所有Segment的大小。
那么ConcurrentHashMap是如何判断在统计的时候容器是否发生了变化呢?使用modCount变量,在put , remove和clean方法里操作元素前都会将变量modCount进行加1,那么在统计size前后比较modCount是否发生变化,从而得知容器的大小是否发生变化。
因为在累加count操作过程中,之前累加过的count发生变化的几率非常小,所以ConcurrentHashMap的做法是先尝试2次通过不锁住Segment的方式来统计各个Segment大小,如果统计的过程中,容器的count发生了变化,则再采用加锁的方式来统计所有Segment的大小。
那么ConcurrentHashMap是如何判断在统计的时候容器是否发生了变化呢?使用modCount变量,在put , remove和clean方法里操作元素前都会将变量modCount进行加1,那么在统计size前后比较modCount是否发生变化,从而得知容器的大小是否发生变化。
相关文章推荐
- 从ConcurrentHashMap的size操作来看并发编程的技巧
- c#操作excel时不能设置类 PageSetup 的 PaperSize 属性
- 由于簇计数比预计的高,格式化操作无法完成——Allocation Unit Size Adjustments for Larger NTFS Volumes.
- C++9.3容器定义的类型 size_type 、容器执行的操作 insert
- Android中设置字体大小出现的问题(操作位置:Settings->Display->Font size)
- 存储string的size的操作结果变量必须为string::size_type类型——P73
- poi操作ppt,XSLFTableCell.setText报错:java.lang.IndexOutOfBoundsException: Index: 1, Size: 1
- 编写一个类,实现简单的栈操作。数据的操作按先进后出的顺序。成员函数为pop; push; size; full; empty; print等等
- hibernate 批量操作 hibernate.jdbc.batch_size hibernate.jdbc.fetch_size
- size balance tree 的基本操作
- string的empty和size操作
- 使用文件操作函数实现简单的CP、cat、size功能及读取文件内容初始化结构体
- 诡异之--map clear 之后可能导致size != 0的操作
- string对象的操作 string::size_type类型
- C++ 顺序容器的操作(1)size_type、iterator、const_iterator、difference_type
- Mysql 批量更新操作的时候出错 “Multi-statement transaction required more than 'max_binlog_cache_size' bytes of s
- Pytorch-学习记录 卷积操作——Tensor.size()
- strlen()函数运算符操作与size_t
- 控件的一些基本操作,设置颜色,自动连接,插入图片,padding,ellipsize。
- 《学习opencv》笔记——矩阵和图像操作——cvGertDims,cvGetDimSize,cvGetRow,cvGetRow,cvGetSize and cvGetSubRect