ConcurrentHashMap的源码分析-CounterCells解释

ConcurrentHashMap使用CounterCell数组来记录元素个数,以避免在高并发环境下对单一size变量加锁造成的性能影响。每个CounterCell存储部分计数值,size方法通过循环累加CounterCell的值来获取总元素数。这种方式提高了并发性能并降低了冲突。
摘要由CSDN通过智能技术生成

ConcurrentHashMap是采用CounterCell数组来记录元素个数的,像一般的集合记录集合大小,直接定义一个size的成员变量即可,当出现改变的时候只要更新这个变量就行。为什么ConcurrentHashMap要用这种形式来处理呢?

问题还是处在并发上,ConcurrentHashMap是并发集合,如果用一个成员变量来统计元素个数的话,为了保证并发情况下共享变量的的难全兴,势必会需要通过加锁或者自旋来实现,如果竞争比较激烈的情况下,size的设置上会出现比较大的冲突反而影响了性能,所以在ConcurrentHashMap采用了分片的方法来记录大小,具体什么意思,我们来分析下 

private transient volatile int cellsBusy;// 标识当前cell数组是否在初始化或扩容中的CAS标志位 
/** 
* Table of counter cells. When non-null, size is a power of 2. 
*/ 
private transient volatile CounterCell[] counterCells;// counterCells数组,总数值的分值分别存在每个cell中 

@sun.misc.Contended static final class CounterCell { 
	volatile long value; 
	CounterCell(long x) { value = x; } 
} 
//看到这段代码就能够明白了,CounterCell数组的每个元素,都存储一个元素个数,而实际我们调用size方法就是通过这个循环累加来得到的 

//又是一个设计精华,大家可以借鉴; 有了这个前提,再会过去看addCount这个方法,就容易理解一些了 
final long sumCount() { 
	CounterCell[] as = counterCells; CounterCell a; 
	long sum = baseCount; 
	if (as != null) { 
		for (int i = 0; i < as.length; ++i) { 
			if ((a = as[i]) != null) 
			sum += a.value; 
		} 
	} 
	return sum; 
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值